MySQL - 是否可以在IN()语句中使用group_concat?

时间:2017-09-05 04:38:02

标签: mysql group-concat

我一直在尝试使用“group_concat”来构建一个在IN()中使用的值列表,但即使仔细制作逗号分隔的单引号值字符串似乎也不起作用。即使group_concat的显示值为'de','es','fr',并且错误地返回了一条记录的结果集,以下内容也不会在group_concat的列表中“找到”“fr”; < / p>

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()”相比,这样的文本搜索可能效率较低,“优化器可能会以不同的方式安排调度。

我已经尝试了我所知道的每一个技巧(cast(),试图重新组合清单等)并且我很新鲜。我不确定这是否是group_concat的限制,或者甚至可能是MySQL编译器中的“bug”。如果有人有任何好的想法,我会非常感激。

由于

1 个答案:

答案 0 :(得分: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

请注意,我从table_name列表中删除了table_columnGROUP BY,因为您在WHERE子句中为这些列指定了固定值。此外,我从Message列表中删除了SELECT,因为它没有出现在组中,也不在聚合函数中。您的原始查询甚至不会在某些版本的MySQL或大多数其他数据库上运行。