MySQL - 是否可以在IN()语句中使用group_concat?
我一直在尝试使用“group_concat”构建IN()中使用的值列表,但即使仔细制作逗号分隔的单引号值字符串似乎也不起作用。即使group_concat的显示值为'de','es','fr',并且一个记录的结果集不正确地返回,以下操作也不会在group_concat'ed列表中“查找”“fr”;MySQL - 是否可以在IN()语句中使用group_concat?
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” 的确是发现和ResultSet是适当空:
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优化计划不同。我已经尝试了所有我知道的技巧(演员(),试图重组列表等),我刚刚出现。我不确定这是否是group_concat的限制,或者甚至是MySQL编译器中的“bug”。如果任何人有任何好的想法,我会非常感激。
感谢
你应该使用条件聚集在你的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
注意,我从GROUP BY
列表中删除table_name
和table_column
,因为您指定WHERE
子句中这些列的固定值。另外,我从SELECT
列表中删除了Message
,因为它不出现在组中,也不在聚合函数中。您的原始查询甚至不会在特定版本的MySQL或大多数其他数据库上运行。
杰出的思想Tim。感谢您的回应。我只是试过,它的工作。我很好奇你对性能的看法:你提交的条件性的agg示例需要0.0017秒才能运行,其中“locate”只需要运行0.00084秒。将有条件最终击中“终极速度”还是成比例攀升? – rotor155
我不得不学习完整的'EXPLAIN'来给出一个完整的答案,但通过直觉,MySQL必须总是检查每个'table_id'组以确保法语不会出现在任何地方。这应该与表格的大小成比例,可能不是线性的,但罚款应该随着大小的增加而变大。 –
啊,是的,我不知道我甚至用'GROUP BY'的想法,正如你注意到的,我已经把它们放在WHERE子句中。再次感谢... – rotor155
这整个方法听起来对我来说是狡猾的,但请参阅https://meta.*.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to -be-a-very-simple-sql-query – Strawberry