为啥 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,viaplay
在GROUP_CONCAT(service)
列中。但我需要在HAVING
中有过滤器,否则在某些情况下我将无法获得所需的所有信息。
如果我将 GROUP_CONCAT(service)
替换为 service
,它也可以工作。只有当我同时使用 GROUP_CONCAT
和 HAVING
时它才会失败
所有这些都来自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 进行选择
为啥 group_concat 会为每一行带来所有产品 ID
group by后接的having语句怎样使用才是有效的,我为啥不行的
MySQL: GROUP BY + HAVING MAX(...) --- 为啥 HAVING MAX(grade) 不会返回最高等级?