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

标签 mysql group-concat

我一直在尝试使用“group_concat”构建一个在 IN() 中使用的值列表,但即使仔细制作一个逗号分隔的单引号值字符串似乎也不起作用。即使group_concat的显示值为'de','es','fr',以下代码也不会在group_concat'ed列表中“找到”“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 编译器中的“错误”。如果有人有任何好的想法,我将不胜感激。

谢谢

最佳答案

您应该在 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_nametable_column来自GROUP BY列表,因为您在 WHERE 中为这些列指定了固定值条款。另外,我删除了 Message来自SELECT列表,因为它既不出现在 group by 中,也不在聚合函数内。您的原始查询甚至无法在某些版本的 MySQL 或大多数其他数据库上运行。

关于MySQL - 是否可以在 IN() 语句中使用 group_concat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46047101/

相关文章:

如果没有编辑数据,PHP 更新会出错

mysql - GROUP_CONCAT 上的 ORDER BY 日期时间不起作用

PHP/MySQL 编码

MySQL 如何对 Joined 和 Group_Concat 列进行排序?

mysql - 3 MySQL表结构的GROUP_CONCAT?

mysql - 带有 WHERE IN 子句的 GROUP_CONCAT

MySQL Group_Concat 按 Id 区分

php - MySQLi 准备好的语句在相同的常规查询成功的情况下失败

mysql - 将 TSV 格式转换为可上传 MySQL 数据库?

php - 重新定义行名称