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

MySQL - is it possible to use group_concat in an IN() statement?

我一直在尝试使用 "group_concat" 构建用于 IN() 的值列表,但即使精心制作逗号分隔的单引号值字符串似乎也不起作用。 group_concat 后的列表中没有 "find" "fr",即使 group_concat 的显示值为 'de'、'es', '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 编译器中的 "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_nametable_column,因为您在 WHERE 子句中为这些列指定了固定值。另外,我从 SELECT 列表中删除了 Message,因为它既没有出现在分组依据中,也没有出现在聚合函数中。您的原始查询甚至不会 运行 在某些版本的 MySQL 或大多数其他数据库上。