如何抑制GROUP_CONCAT MySQL中的重复项

时间:2014-09-30 16:45:52

标签: mysql duplicates group-concat

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

这正确地给了我像

这样的称呼
  • Mrs Sally G Bloggs&弗雷德史密斯先生

这很好,但它也给了我

  • Jean Brown夫人&哈里先生
  • 先生

这是坏的,因为姓氏相同但却重复了。

有没有办法做GROUP_CONCAT行,这样我才能获得只显示一次的重复姓氏 例如

  • Mrs Sally G Bloggs&弗雷德史密斯先生
  • Jean&Mrs;哈里先生
  • 先生

我使用的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姓氏SEPARATOR' &安培; ')AS   称呼,

2 个答案:

答案 0 :(得分:0)

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

您可以通过两个步骤来完成此任务:

  • 首先,我们按地址和姓氏组
  • 连接标题和两个名字
  • 在外部查询中,我们仅按地址组连接第一部分和姓氏
  • 另外:我们也为没有第二个姓名的人取代双重空白。

您可以使用此查询:

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函数来消除双重空白。

答案 1 :(得分:0)

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

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

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

您可以使用:

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

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