如何抑制 GROUP_CONCAT MySQL 中的重复项

Posted

技术标签:

【中文标题】如何抑制 GROUP_CONCAT MySQL 中的重复项【英文标题】:How to suppress duplicates in GROUP_CONCAT MySQL 【发布时间】:2014-11-25 09:14:56 【问题描述】:

我使用 mysql 选择查询来获取地址标签的人员姓名和地址。 可能不止一个人住在同一个地址,所以我做了一个 GROUP CONCAT 将他们的名字与一个地址结合起来。

这正确地给了我这样的称呼

Sally G Bloggs 夫人和 Fred Smith 先生

这很好,但它也给了我

让·布朗夫人和哈里·布朗先生

这很糟糕,因为姓氏是一样的,但它却被重复了。

有没有办法做 GROUP_CONCAT 行,这样我就可以得到重复的姓氏只显示一次 例如

Sally G Bloggs 夫人和 Fred Smith 先生 让夫人和哈里布朗先生

我使用的sql的重要一点是

  SELECT
  GROUP_CONCAT(
               CONCAT_WS ( ' ', title , forname_1 , forename_2, surname ) 
               SEPARATOR ' & '
               ) AS Salutation,
  addresses.the_address
  FROM  
       people
  JOIN 
       addresses
  ON  
       addresses.address_id = people.address_id
 GROUP BY  
       people_address_id

(这篇文章mysql GROUP_CONCAT duplicates 展示了如何从仅涉及一个字段的 Group_concat 中删除重复项,但我看不到如何使用多字段 concat 的一部分和这个 mysql GROUP_CONCAT DISTINCT multiple columns 提供了一个解决方案,但我使用它时遇到语法错误

GROUP_CONCAT(DISTINCT CONCAT_WS ( ' ', title , forname_1 , forename_2, surname ) GROUP BY surname SEPARATOR ' & ') AS 问候,

【问题讨论】:

【参考方案1】:

您的目标与链接问题的目标略有不同。如果两个具有相同地址的人具有相同的姓氏,您只想删除重复的姓氏。

您可以通过两步流程获得此信息:

首先,我们通过地址和姓氏组来连接头衔和姓名 在外部查询中,我们仅按地址组连接第一部分和姓氏 补充:我们也为没有第二个名字的人替换了双空格。

你可以使用这个查询:

SELECT 
    REPLACE(GROUP_CONCAT(
        CONCAT_WS(' ', t.name, t.surname) 
        SEPARATOR ' & '
    ), '  ', ' ') AS Salutation,
    addresses.the_address
FROM (
    SELECT
        GROUP_CONCAT(
            CONCAT_WS(' ', title, forname_1, forename_2)
            SEPARATOR ' & '
        ) name,
        surname,
        address_id
    FROM
        people
    GROUP BY
        address_id, surname
) t
INNER JOIN
    addresses
ON
    addresses.address_id = t.address_id
GROUP BY 
    t.address_id;

查看它在 this demo 中的工作情况 此解决方案考虑到具有不同姓氏的第三人可以住在同一地址,即岳母。

说明

内部查询

SELECT
    GROUP_CONCAT(
        CONCAT_WS(' ', title, forname_1, forename_2)
        SEPARATOR ' & '
    ) name,
    surname,
    address_id
FROM
    people
GROUP BY
    address_id, surname

仅连接居住在同一地址并具有相同姓氏的人的头衔和名字(参见演示中的第二个查询)。

然后我们执行与您之前相同的 group_concat 并在最后一步中使用 REPLACE 函数来消除双空格。

【讨论】:

我知道我们不应该让 cmets 说“谢谢”,但我不太确定这个论坛是如何运作的,所以感谢您的精彩回答。它不仅完全按照我的意愿工作,而且您提供了更有用的解释 - 教人钓鱼.... 不客气!很高兴你能在我的帮助下解决你的问题,并学会了如何做这些事情。据我所知,“谢谢” cmets 并不令人反感。 “谢谢”的回答当然是不需要的。【参考方案2】:

您可以在 group_concat() 中使用 'distinct' 来删除重复项。

例如,假设您有多个所有者的保险单。您有一个名称列表和一个策略列表。 Alice 和 Bob 都是政策 123 的所有者,而您不希望:

姓名:爱丽丝,鲍勃,爱丽丝,鲍勃

你可以使用:

select group_concat(distinct names.customerNames) from names where names.policyId=policies.policyId) as 'policy owners',

在“names”和“policies”表之间的连接中。

【讨论】:

以上是关于如何抑制 GROUP_CONCAT MySQL 中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何在Mysql中组合两列和group_concat

关于如何在vertica上使用MySQL的group_concat()函数

当我在查询中使用“GROUP_CONCAT”和“HAVING”时如何计算 MySQL 结果?

如何将 MySQL 子查询中的所有不同值选择到 group_concat 中?

如何在 mysql 的 Group_concat 子查询中使用选择查询

如何仅使用“group_concat”过滤表 mysql 中的行