在where子句中使用查询语句inside in()时获得一行而不是多行



模式中有两个表fruits和fruits_seasons,我想获取所有的季风雨水果。当我尝试这样做时,我注意到一个奇怪的反应。

https://dbfiddle.uk/?rdbms=mysql_8.0&小提琴= 77 d52b2736a04a5adf4ffe80881cd4ab

季风月

select group_concat(fruit_id) from fruits_seasons where monsoon = 1;
group_concat(fruit_id)
2, 8, 9, 11, 13, 15

GROUP_CONCAT()返回一个字符串,它是一个逗号分隔的值列表,因此您的代码相当于:

WHERE f.id IN ('2,8,9,11,13,15')

所以,你比较id,这是一个整数和列表中唯一的项目,这是一个字符串,在这种情况下,MySql试图将字符串转换为整数。
转换的结果是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);

相关内容

最新更新