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