为啥 HAVING 和 GROUP_CONCAT 在此查询中不能一起工作?

Posted

技术标签:

【中文标题】为啥 HAVING 和 GROUP_CONCAT 在此查询中不能一起工作?【英文标题】:Why are HAVING and GROUP_CONCAT not working together in this query?为什么 HAVING 和 GROUP_CONCAT 在此查询中不能一起工作? 【发布时间】:2016-04-02 16:24:05 【问题描述】:

这个查询:

 SELECT name,
 REPLACE(REPLACE(REPLACE(LOWER(name),' ',''),'-',''),':','') AS formattedName,
 GROUP_CONCAT(service)
 FROM movies
 GROUP BY formattedName
 HAVING COUNT(CASE WHEN name like "%von brom%" THEN 1 END) > 0;

给我以下结果:

+---------------------------------------------+---------------------------------------+---------------------+
|name                                         |formattedName                          |GROUP_CONCAT(service)|
+---------------------------------------------+---------------------------------------+---------------------+
|LasseMajas detektivbyrå: Von Broms hemlighet |lassemajasdetektivbyråvonbromshemlighet|sfanytime            |
+---------------------------------------------+---------------------------------------+---------------------+
|LasseMajas detektivbyrå - Von Broms hemlighet|lassemajasdetektivbyråvonbromshemlighet|boxer                |
+---------------------------------------------+---------------------------------------+---------------------+
|LasseMajas detektivbyrå - Von Broms hemlighet|lassemajasdetektivbyråvonbromshemlighet|viaplay              |
+---------------------------------------------+---------------------------------------+---------------------+

“formattedName”列中的所有值看起来都相同,那么为什么不将这些行分组在一起呢?

如果我使用WHERE 来过滤行,而不是HAVING,它实际上似乎可以工作。结果它给了我一行,sfanytime,boxer,viaplayGROUP_CONCAT(service) 列中。但我需要在HAVING 中有过滤器,否则在某些情况下我将无法获得所需的所有信息。

如果我将 GROUP_CONCAT(service) 替换为 service,它也可以工作。只有当我同时使用 GROUP_CONCATHAVING 时它才会失败

所有这些都来自https://www.one.com 上的数据库中的 phpMyAdmin。如果我尝试使用 mysql 工作台在我自己的计算机上的相同本地数据库上做同样的事情,一切都会按预期工作,并且在所有情况下(HAVING/WHERE,有或没有GROUP_CONCAT)。

是什么导致了这种奇怪的行为?会不会和特殊字符“å”有关?

我的character_set_server 在本地数据库上设置为utf8,在one.com 数据库上设置为latin1

在 one.com 数据库上调用 SELECT @@version; 给我:

5.5.45-MariaDB-1~wheezy

在本地数据库上它给了我:

5.7.9-log

【问题讨论】:

听起来像是 MariaDB 和真正的 MySQL 不兼容。 您确定name 字段中没有非打印字符吗? @Uueerdo 我该如何检查? 你确定这是整个 formattedName 吗?也许你选择的客户没有显示整行。也试试GROUP BY TRIM(formattedName) @Uueerdo 如果我删除了GROUP_CONCAT,为什么它会起作用? 【参考方案1】:

如果您不对数据使用GROUP 函数,则应该使用WHERE 而不是HAVING

SELECT 中的所有返回数据都应该在 GROUP BY 语句中,或者应用了 GROUP 函数。

应用这两个规则后,查询变为:

SELECT name,
 REPLACE(REPLACE(REPLACE(LOWER(name),' ',''),'-',''),':','') AS formattedName,
 GROUP_CONCAT(service)
 FROM movies
 WHERE name LIKE  "%von brom%"
 GROUP BY formattedName,name;

【讨论】:

你绝对可以使用别名进行分组。 他的问题是如何合并所有具有相同格式名称的行。当它按name 分组时,您的答案是如何做到的? @Barmar:GROUP BY 别名:显然有可能,旧版本或其他 DBMS 不允许这样做(所以我只知道需要调整:))。性能:因为不能再使用索引,所以这将是废话,因此在将函数应用于别名后,可能不建议在别名上使用GROUP 如果表中没有包含您要分组的信息的列,那么显然它不能被索引。但是您可能仍然需要这样做。如果数据库不直接支持,可以使用子查询:SELECT * FROM (SELECT <expression> AS alias, ...) GROUP BY alias 我已对其进行了更改,以便在过滤名称时使用组函数,但它仍然给出了完全相同的结果。我不能使用 WHERE,因为在某些情况下我将无法获得所需的所有信息。而且,如果你说的一切都是正确的,为什么它在我的本地数据库上工作?

以上是关于为啥 HAVING 和 GROUP_CONCAT 在此查询中不能一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

使用 GROUP_CONCAT、GROUP BY、HAVING 进行选择

使用 HAVING GROUP_CONCAT 计算记录行

为啥 group_concat 会为每一行带来所有产品 ID

group by后接的having语句怎样使用才是有效的,我为啥不行的

mysql 数据操作 单表查询 having 过滤 练习

MySQL: GROUP BY + HAVING MAX(...) --- 为啥 HAVING MAX(grade) 不会返回最高等级?