在 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.