MySQL:带有 ORDER BY COUNT 的 GROUP_CONCAT?

Posted

技术标签:

【中文标题】MySQL:带有 ORDER BY COUNT 的 GROUP_CONCAT?【英文标题】:MySQL: GROUP_CONCAT with an ORDER BY COUNT? 【发布时间】:2011-10-29 09:12:29 【问题描述】:

这可能吗?

假设我有一个地址列表,其中包含很多重复条目。我需要过滤掉所有重复项,因为有些地址的名称略有不同,但邮政编码和电话号码相同。

首先我对邮政编码和电话进行 GROUP BY。

SELECT name, address, postalcode, place, phone
FROM addresses
GROUP BY postalcode, phone

然后我得到随机的名字。我想获得最佳的名字,即每个邮政编码/电话条目最多的名字。

所以我想到了以下内容。这里我使用 SUBSTRING_INDEX 函数只获取 group_concat 中的第一项(其中没有带有字符串 '~~' 的名称):

SELECT SUBSTRING_INDEX(
         GROUP_CONCAT(DISTINCT name ORDER BY COUNT(name) DESC SEPARATOR '~~')
       , '~~', 1),
       address,
       postalcode,
       place,
       phone
FROM addresses
GROUP BY postalcode, telephone

但我得到一个“无效使用组功能”。

如何让 GROUP_CONCAT 按名称出现的次数排序?

【问题讨论】:

addressplace 会发生什么?它们也可能有不同的值,可能与返回的名称无关。 嗯,我使用邮政编码表从邮政编码中检查地址/地点,所以它基本上是我需要过滤的名称。 (在荷兰,每条街道都有不同的邮政编码) 【参考方案1】:

自己找到了一个解决方案,带有一个子查询:

SELECT 
  SUBSTRING_INDEX(
    GROUP_CONCAT(DISTINCT name ORDER BY CountName DESC SEPARATOR '||')
  , '||', 1),
  address,
  postalcode,
  place,
  phone
FROM (

  SELECT name, address, postalcode, place, phone , COUNT(name) AS CountName
  FROM addresses
  GROUP BY name, postalcode, phone
  ORDER BY COUNT(name) DESC

) as a
GROUP BY postalcode, phone

我想知道它是否可以在没有子查询的情况下完成。

【讨论】:

这对我来说将是一个单一的查询。您在那里有一个子选择,但它似乎仍然是一个查询。

以上是关于MySQL:带有 ORDER BY COUNT 的 GROUP_CONCAT?的主要内容,如果未能解决你的问题,请参考以下文章

java中如何实现mysql中的group by order by count()功能

mysql使用带有子查询的临时表,但不是group by和order by

MySQL 进阶 索引 -- SQL优化(插入数据优化:导入本地文件数据主键优化order by优化group by优化limit优化count优化update优化)

mysql group by order by limit 1

ORDER BY 中查询非常慢,LIMIT 范围较大

带有 LEFT JOIN 和 GROUP BY 的 COUNT(*) 在 MySQL 中包含 NULL