Mysql 为什么HAVING和GROUP_CONCAT在此查询中不一起工作?

Mysql 为什么HAVING和GROUP_CONCAT在此查询中不一起工作?,mysql,group-by,mariadb,group-concat,Mysql,Group By,Mariadb,Group Concat,此查询: 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; 给我以下结果: +---------------

此查询:

 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
来过滤行,而不是
具有
,那么它实际上似乎可以工作。结果它给了我一行,在
GROUP\u CONCAT(service)
列中有
sfanytime、boxer、viaplay
。但是我需要在
HAVING
中设置过滤器,因为在某些情况下,否则我无法获得所需的所有信息

如果我仅用
服务
替换
组(服务)
,它也会起作用。只有同时使用
GROUP\u CONCAT
have

所有这些都来自于上的数据库phpMyAdmin。如果我使用MySQL workbench在我自己的计算机上的同一个本地数据库上尝试做同样的事情,那么一切都会按预期进行,并且在所有情况下都会将行分组在一起(
具有
/
,其中
,具有或不具有
组\u CONCAT

是什么导致了这种奇怪的行为?这可能与“å”这个特殊角色有关吗

我的
字符集\服务器
在本地数据库上设置为
utf8
,在one.com数据库上设置为
latin1

调用
SELECT@@version为我提供:

5.5.45-MariaDB-1~wheezy
5.7.9-log
在本地数据库上,它给了我:

5.5.45-MariaDB-1~wheezy
5.7.9-log

如果不在数据上使用
函数,则应该使用
WHERE
而不是
have

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

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

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

你绝对可以在别名上分组。他的问题是如何组合所有具有相同格式名称的行。当按
名称进行分组时,您的答案是如何做到的?@Barmar:
别名进行分组:显然这是可能的,旧版本或其他DBMS不允许这样做(因此需要调整的只是我的知识:)。性能:这将是垃圾,因为不再可以使用索引,所以在对别名应用函数后,可能不建议对其进行
分组
。如果表中没有包含要分组的信息的列,则显然无法对其进行索引。但你可能仍然需要这样做。如果DB不直接支持它,您可以通过子查询来实现:
SELECT*FROM(SELECT AS alias,…)GROUP BY alias
我已经更改了它,以便在过滤名称时使用GROUP函数,但它仍然给出完全相同的结果。我不能使用WHERE,因为在某些情况下,我无法获得所需的所有信息。而且,如果你说的一切都是正确的,为什么它在我的本地数据库上工作?听起来像是MariaDB和real MySQL之间不兼容。你确定
name
字段中没有非打印字符吗?@uuerdo我该怎么检查?你确定这是整个格式化名称吗?也许你选择的客户端没有显示整行。也可以尝试
按TRIM分组(formattedName)
@uuerdo如果我删除了
GROUP\u CONCAT
,为什么它会起作用?