我一直在尝试使用“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”。如果有人有任何好的想法,我会非常感激。
由于
答案 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_column
和GROUP BY
,因为您在WHERE
子句中为这些列指定了固定值。此外,我从Message
列表中删除了SELECT
,因为它没有出现在组中,也不在聚合函数中。您的原始查询甚至不会在某些版本的MySQL或大多数其他数据库上运行。