模式中有两个表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);