2017-09-05 524 views
0

我一直在尝试使用“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”。如果任何人有任何好的想法,我会非常感激。

感谢

+0

这整个方法听起来对我来说是狡猾的,但请参阅https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to -be-a-very-simple-sql-query – Strawberry

回答

1

你应该使用条件聚集在你的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_nametable_column,因为您指定WHERE子句中这些列的固定值。另外,我从SELECT列表中删除了Message,因为它不出现在组中,也不在聚合函数中。您的原始查询甚至不会在特定版本的MySQL或大多数其他数据库上运行。

+0

杰出的思想Tim。感谢您的回应。我只是试过,它的工作。我很好奇你对性能的看法:你提交的条件性的agg示例需要0.0017秒才能运行,其中“locate”只需要运行0.00084秒。将有条件最终击中“终极速度”还是成比例攀升? – rotor155

+0

我不得不学习完整的'EXPLAIN'来给出一个完整的答案,但通过直觉,MySQL必须总是检查每个'table_id'组以确保法语不会出现在任何地方。这应该与表格的大小成比例,可能不是线性的,但罚款应该随着大小的增加而变大。 –

+0

啊,是的,我不知道我甚至用'GROUP BY'的想法,正如你注意到的,我已经把它们放在WHERE子句中。再次感谢... – rotor155

相关问题