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_name
和 table_column
,因为您在 WHERE
子句中为这些列指定了固定值。另外,我从 SELECT
列表中删除了 Message
,因为它既没有出现在分组依据中,也没有出现在聚合函数中。您的原始查询甚至不会 运行 在某些版本的 MySQL 或大多数其他数据库上。
我一直在尝试使用 "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_name
和 table_column
,因为您在 WHERE
子句中为这些列指定了固定值。另外,我从 SELECT
列表中删除了 Message
,因为它既没有出现在分组依据中,也没有出现在聚合函数中。您的原始查询甚至不会 运行 在某些版本的 MySQL 或大多数其他数据库上。