我一直在尝试使用“group_concat”构建一个在 IN() 中使用的值列表,但即使仔细制作一个逗号分隔的单引号值字符串似乎也不起作用。即使group_concat的显示值为'de','es','fr',以下代码也不会在group_concat'ed列表中“找到”“fr”,并且错误地返回了一条记录的结果集;
SELECT Message, table_id FROM Tenant
LEFT JOIN Translation on Translation.table_id=Tenant.ID
WHERE table_name='Tenant' AND table_column='Message' AND Tenant.ID=2
GROUP BY table_name, table_column, table_id HAVING 'fr' NOT
IN(group_concat(CONCAT('''', language, '''')));
而下面,确实找到了“fr”并且结果集适本地为空:
SELECT Message, table_id FROM Tenant
LEFT JOIN Translation on Translation.table_id=Tenant.ID
WHERE table_name='Tenant' AND table_column='Message' AND Tenant.ID=2
GROUP BY table_name, table_column, table_id HAVING 'fr' NOT IN('de','es','fr')
我意识到我可以使用 LOCATE();
SELECT Message, table_id FROM Tenant
LEFT JOIN Translation on Translation.table_id=Tenant.ID
WHERE table_name='Tenant' AND table_column='Message' AND Tenant.ID=2
GROUP BY table_name, table_column, table_id HAVING LOCATE('de',
group_concat(language)) = 0
但是与“IN()”相比,这样的文本搜索可能效率较低,MySQL 优化器可能以不同的方式调度它。
我已经尝试了我所知道的所有技巧(cast()、尝试重建列表等),而且我很新鲜。我不确定这是否是 group_concat 的限制,或者甚至可能是 MySQL 编译器中的“错误”。如果有人有任何好的想法,我将不胜感激。
谢谢
最佳答案
您应该在 HAVING
中使用条件聚合检查法语字符串的子句:
SELECT
table_id
FROM Tenant
LEFT JOIN Translation
ON Translation.table_id = Tenant.ID
WHERE
table_name = 'Tenant' AND
table_column = 'Message' AND
Tenant.ID = 2
GROUP BY
table_id
HAVING SUM(CASE WHEN language = 'fr' THEN 1 ELSE 0 END) = 0
请注意,我删除了 table_name
和table_column
来自GROUP BY
列表,因为您在 WHERE
中为这些列指定了固定值条款。另外,我删除了 Message
来自SELECT
列表,因为它既不出现在 group by 中,也不在聚合函数内。您的原始查询甚至无法在某些版本的 MySQL 或大多数其他数据库上运行。
关于MySQL - 是否可以在 IN() 语句中使用 group_concat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46047101/