在 in() at where 子句中使用查询语句时获取一行而不是多行
Getting one row insted of multiple rows when using query statment inside in() at where clause
架构中有两个表 fruits 和 fruits_seasons,我想获取所有季风水果。在尝试时,我注意到一个奇怪的反应。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=77d52b2736a04a5adf4ffe80881cd4ab
季风月份
select group_concat(fruit_id) from fruits_seasons where monsoon = 1;
group_concat(fruit_id)
2,8,9,11,13,15
我使用的查询
SELECT
f.name AS name, f.price AS price
FROM
fruits f
where f.id in (select group_concat(fruit_id) from fruits_seasons where monsoon = 1);
我的预期结果
name
price
lemon
15.00
carrot
35.00
papaya
18.00
custard apple
15.00
mango
25.00
apple
25.00
我得到的结果
name
price
lemon
15.00
我得到单行而不是多行的原因是什么?
GROUP_CONCAT()
returns 一个字符串,它是一个逗号分隔的值列表,因此您的代码等效于:
WHERE f.id IN ('2,8,9,11,13,15')
因此,您将整数 id
与列表中唯一的字符串项进行比较,在本例中为 MySql tries to convert the string to an integer.
转换的结果是 2
(可以成功转换为整数的字符串的起始部分)最后你的代码相当于:
WHERE f.id IN (2)
如果您必须使用 GROUP_CONCAT()
来满足您的要求,请使用函数 FIND_IN_SET()
:
而不是运算符 IN
SELECT f.name, f.price
FROM fruits f
WHERE FIND_IN_SET(f.id, (SELECT GROUP_CONCAT(fruit_id) FROM fruits_seasons WHERE monsoon = 1));
但这样更容易:
SELECT f.name, f.price
FROM fruits f
WHERE f.id IN (SELECT fruit_id FROM fruits_seasons WHERE monsoon = 1);
见 demo.
架构中有两个表 fruits 和 fruits_seasons,我想获取所有季风水果。在尝试时,我注意到一个奇怪的反应。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=77d52b2736a04a5adf4ffe80881cd4ab
季风月份
select group_concat(fruit_id) from fruits_seasons where monsoon = 1;
group_concat(fruit_id) |
---|
2,8,9,11,13,15 |
我使用的查询
SELECT
f.name AS name, f.price AS price
FROM
fruits f
where f.id in (select group_concat(fruit_id) from fruits_seasons where monsoon = 1);
我的预期结果
name | price |
---|---|
lemon | 15.00 |
carrot | 35.00 |
papaya | 18.00 |
custard apple | 15.00 |
mango | 25.00 |
apple | 25.00 |
我得到的结果
name | price |
---|---|
lemon | 15.00 |
我得到单行而不是多行的原因是什么?
GROUP_CONCAT()
returns 一个字符串,它是一个逗号分隔的值列表,因此您的代码等效于:
WHERE f.id IN ('2,8,9,11,13,15')
因此,您将整数 id
与列表中唯一的字符串项进行比较,在本例中为 MySql tries to convert the string to an integer.
转换的结果是 2
(可以成功转换为整数的字符串的起始部分)最后你的代码相当于:
WHERE f.id IN (2)
如果您必须使用 GROUP_CONCAT()
来满足您的要求,请使用函数 FIND_IN_SET()
:
IN
SELECT f.name, f.price
FROM fruits f
WHERE FIND_IN_SET(f.id, (SELECT GROUP_CONCAT(fruit_id) FROM fruits_seasons WHERE monsoon = 1));
但这样更容易:
SELECT f.name, f.price
FROM fruits f
WHERE f.id IN (SELECT fruit_id FROM fruits_seasons WHERE monsoon = 1);
见 demo.