Php 在MySQL中,能否将一列中的值字符串转换为另一列中的相应值?
假设我在“人员”表中有如下结构的数据:Php 在MySQL中,能否将一列中的值字符串转换为另一列中的相应值?,php,mysql,Php,Mysql,假设我在“人员”表中有如下结构的数据: userid | fname | lname | favfruit ---------------------------------------------- 001 | Joe | Blow | banana 002 | Jim | Crow | orange 003 | Bozo | Joe | grapes 0
userid | fname | lname | favfruit
----------------------------------------------
001 | Joe | Blow | banana
002 | Jim | Crow | orange
003 | Bozo | Joe | grapes
004 | Mo | Fo | lemon
005 | Back | Hoe | peach
006 | Barack | O | peach
007 | J | Lo | grapes
008 | Yo | Lo | lemon
009 | Hell | No | orange
010 | Steve | Jobs | apple
现在我得到了一个由几个用户标识组成的字符串:
007,001,009,003,010
是否有一个MySQL查询将返回对应favfruits的字符串
grapes,banana,orange,grapes,apple
我的另一种选择是在循环中为每个userid查询表,这似乎太过分了:
<?
$string = "007,001,009,003,010";
$userids = explode(",",$string);
foreach($userids as $id) {
$query = "SELECT favfruit FROM people WHERE userid='$id'";
$res = mysql_query($query); <-- deprecated, i know.
$fruits[] = mysql_result($res,0,"favfruit"); <-- just to illustrate. :)
}
$newstring = implode(",",$fruits); // = grapes,banana,orange,grapes,apple
?>
试试这个:
SELECT GROUP_CONCAT(favfruit
ORDER BY favfruit ASC SEPARATOR ', ') AS favfruit
FROM people
WHERE userid IN (007,
001,
009,
003,
010);
您可以通过用户ID订购此。只需将favfruit
替换为userid
到GROUP\u CONCAT
试试以下方法:
SELECT GROUP_CONCAT(favfruit
ORDER BY favfruit ASC SEPARATOR ', ') AS favfruit
FROM people
WHERE userid IN (007,
001,
009,
003,
010);
SELECT favfruit FROM people where userid in (007,001,009,003,010);
您可以通过用户ID订购此。只需将favfruit
替换为userid
到GROUP\u CONCAT
SELECT favfruit FROM people where userid in (007,001,009,003,010);
@Mahfuzur Rahman博士的回答将返回一个字符串。这将返回每个水果的结果集
@Mahfuzur Rahman博士的回答将返回一个字符串。这将返回每个水果的结果集。如果需要userid
和favfruit
之间的对应关系,我首选的方法是在结果中连接它们
SELECT GROUP_CONCAT(',', CONCAT(userid, ':', favfruit) AS users_and_fruits
FROM people
WHERE userid IN ('007','001','009','003','010');
这将返回如下字符串:
007:grapes,001:banana,009:orange,003:grapes,010:apple
然后,可以分解此项并分解每个项以获得对应关系
如果您不希望这样做,只希望列表的顺序与原始列表的顺序相同,请使用orderbyfield
SELECT GROUP_CONCAT(favfruit ORDER BY FIELD(userid, '007','001','009','003','010')) AS favfruits
FROM people
WHERE userid IN ('007','001','009','003','010');
在所有这些查询中,请确保引用用户ID,因为数字的前导零将被丢弃,并且它们不会正确匹配(或者将userid
列更改为INT
)。如果需要userid
和favfruit
之间的对应关系,我更喜欢的方法是在结果中连接它们
SELECT GROUP_CONCAT(',', CONCAT(userid, ':', favfruit) AS users_and_fruits
FROM people
WHERE userid IN ('007','001','009','003','010');
这将返回如下字符串:
007:grapes,001:banana,009:orange,003:grapes,010:apple
然后,可以分解此项并分解每个项以获得对应关系
如果您不希望这样做,只希望列表的顺序与原始列表的顺序相同,请使用orderbyfield
SELECT GROUP_CONCAT(favfruit ORDER BY FIELD(userid, '007','001','009','003','010')) AS favfruits
FROM people
WHERE userid IN ('007','001','009','003','010');
在所有这些查询中,请确保引用用户ID,因为数字的前导零将被丢弃,并且它们不会正确匹配(或者将userid
列更改为INT
)。您可以在中使用<代码>用户ID在($string)中的位置
。如果$string
是用户输入,请将其参数化。谢谢chris85。这有助于确定逗号分隔的字符串中是否存在值,但它不会转换为相应的列。您在选择
列表中拉取该列,还是我误读了?您可以使用中的<代码>用户ID在($string)中的位置
。如果$string
是用户输入,请将其参数化。谢谢chris85。这有助于确定逗号分隔的字符串中是否存在值,但它不会转换为相应的列。您在选择列表中拉取了该列,还是我误读了?但这不一定会保持顺序,以防这很重要。哇,这很快,md。它成功了!关于秩序的观点很好,约阿希姆。“有什么解释吗?”约阿希米沙克松说得对。它没有保持顺序,我想我解决了顺序问题,将它附加到查询:orderby字段(userid,$string)。我会做一些测试,但听起来对吗?@JoshR,如果你真的需要遵守秩序,这在这里也是可能的。但这不一定会遵守秩序,以防这很重要。哇,那太快了,医学博士。它成功了!关于秩序的观点很好,约阿希姆。“有什么解释吗?”约阿希米沙克松说得对。它没有保持顺序,我想我解决了顺序问题,将它附加到查询:orderby字段(userid,$string)。我会做一些测试,但听起来对吗?@JoshR,如果你真的需要遵守秩序,这里也可以。我想他需要一根字符串。在他的代码中,他使用了这个$newstring=infrade(“,”,$fruits)代码>。谢谢@gremash。这提供了正确的水果,可以很容易地做成一根线,但不是按照相应的顺序。我想他需要一根线。在他的代码中,他使用了这个$newstring=infrade(“,”,$fruits)代码>。谢谢@gremash。这提供了正确的结果,可以很容易地做成一个字符串,但不是按照相应的顺序。我认为你解决了这个问题,@Barmar。我在order by字段中使用了一个逗号分隔的字符串,而不是用逗号分隔的单独引用字符串。现在的麻烦是将一个转换成另一个('x,y,z'>'x','y','z')。我也会试试你喜欢的方法。谢谢知道了!userid列已经是INT。我只需要完全删除引号:orderbyfield(userid,007001009003010)
成功了。如果是INT,在显示表内容时它如何显示前导零?我原来问题中的表不是我正在使用的真正的表,但是如果实际的表在INT列中出现了前导零,我认为零填充就是原因,对吗?这就是你的意思吗?值得一提的是,我真正的应用程序中的userid字符串不包括前导零,所以它看起来更像是按字段排序(userid,7,1,9,3,10)
其中userid列是INT(10)UNSIGNED ZEROFILL。我不知道ZEROFILL选项我认为你解决了问题,@Barmar。我在order by字段中使用了一个逗号分隔的字符串,而不是用逗号分隔的单独引用字符串。现在的麻烦是将一个转换成另一个('x,y,z'>'x','y','z')。我也会试试你喜欢的方法。谢谢知道了!userid列已经是INT。我只需要完全删除引号:orderbyfield(userid,007001009003010)
成功了。如果是INT,在显示表内容时它如何显示前导零?我原来问题中的表不是我正在使用的真正的表,但是如果实际的表在INT列中出现了前导零,我认为零填充就是原因,对吗?这就是你的意思吗?为wh