MySQL中IN子句传入group_concat子查询结果仅返回单行问题
问题根本原因
GROUP_CONCAT(fruit_id)的返回结果是单个逗号拼接的字符串,并不是IN子句需要的多个独立数值集合,你执行的SQL本质等价于WHERE f.id IN ('2,8,9,11,13,15')- MySQL做数值和字符串的隐式类型转换时,会从字符串开头截取到第一个非数字字符为止,字符串
'2,8,9,11,13,15'转成数值后结果只有2,因此仅能匹配到id为2的柠檬记录。
正确写法
写法1(推荐,性能最优):直接子查询返回id集合,不需要拼接
SELECT f.name AS name, f.price AS price FROM fruits f WHERE f.id IN (SELECT fruit_id FROM fruits_seasons WHERE monsoon = 1);
写法2(适配现有逻辑的修改方案):用FIND_IN_SET做字符串匹配
SELECT f.name AS name, f.price AS price FROM fruits f WHERE FIND_IN_SET(f.id, (SELECT group_concat(fruit_id) FROM fruits_seasons WHERE monsoon = 1));
内容的提问来源于stack exchange,提问作者Suvel Mano
相关产品推荐
相关产品推荐

