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
,为什么它会起作用?