假设我在表格中有数据"人们"结构如下:
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
现在我给出了一系列用户ID:
007,001,009,003,010
是否有一个MySQL查询会返回相应的favfruits字符串?:
grapes,banana,orange,grapes,apple
我的另一种方法是在每个用户ID的循环中查询表,这似乎是超级的:
<?
$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
?>
是否有更好的(单一查询)方法?
答案 0 :(得分:2)
如果您需要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
然后你可以爆炸并爆炸每个项目以获得对应关系。
如果您不想要这个,只想要一个与原始列表顺序相同的列表,请使用ORDER BY FIELD
。
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
)。
答案 1 :(得分:1)
试试这个:
SELECT GROUP_CONCAT(favfruit
ORDER BY favfruit ASC SEPARATOR ', ') AS favfruit
FROM people
WHERE userid IN (007,
001,
009,
003,
010);
您可以ORDER
此BY userid
。只需将favfruit
userid
替换为GROUP_CONCAT
。
答案 2 :(得分:0)
SELECT favfruit FROM people where userid in (007,001,009,003,010);
@Md Mahfuzur Rahman的回答将返回一个字符串。这个将返回每个水果的结果集。