如何在GROUP_CONCAT MySQL中隐藏重复项

stszievb  于 2022-12-03  发布在  Mysql
关注(0)|答案(3)|浏览(177)

我使用MySQL select查询来获取地址标签中的人名和地址。可能有多个人住在同一个地址,所以我使用GROUP CONCAT将他们的名字与一个地址组合在一起。
这样我就能正确地称呼你

  • 萨莉·G·布洛格斯夫人和弗雷德·史密斯先生

这很好但也给予了我

  • 简·布朗夫人和哈里·布朗先生

这是不好的,因为姓氏是一样的,但它得到重复。
有没有办法做GROUP_CONCAT行,这样我得到重复的姓氏只显示一次,例如

  • 萨莉·G·布洛格斯夫人和弗雷德·史密斯先生
  • Jean夫人和Harry Brown先生

我使用的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

(This文章mysql GROUP_CONCAT duplicates展示了如何从只涉及一个字段的Group_concat中删除重复项,但我不知道如何使用多字段concat的一部分来实现这一点,而这篇文章mysql GROUP_CONCAT DISTINCT multiple columns给出了一个解决方案,但使用它时出现语法错误
GROUP_CONCAT(DISTINCT CONCAT_WS(' ',头衔,前名_1,前名_2,姓氏)GROUP BY姓氏分隔符' & ')AS称呼,

r6vfmomb

r6vfmomb1#

您可以在group_concat()中使用'distinct'来移除重复项。
例如,假设您有多个所有者的保险单。您有一个姓名列表和一个保险单列表。Alice和Bob都是保险单123的所有者,并且您不希望:
姓名:爱丽丝,鲍勃,爱丽丝,鲍勃
您可以用途:

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

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

t9eec4r0

t9eec4r02#

您的目标与您的链接问题稍有不同。您只想删除重姓,如果两个人有相同的地址,有相同的姓氏。
您可以通过两个步骤来实现此目的:

  • 首先,我们将称谓和人名按姓氏和地址分组进行连接。
  • 在外部查询中,我们仅通过地址组来连接第一部分和姓氏
  • 增加:我们也替换了没有第二个名字的人的双空白。

您可以使用此查询:

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;

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

说明

内部查询

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

cngwdvgl

cngwdvgl3#

您可以使用以下命令:

GROUP_CONCAT(DISTINCT column)

太简单了!

相关问题