智能地组合MySQL选择结果中的重复行

时间:2016-12-04 10:45:33

标签: mysql sql

我有一个小型的MySQL数据库,其中包含我居住的这个综合体中的100多名居民。为简化起见,它包含单元号,姓氏,名字,电话号码和电子邮件地址。电子邮件地址与问题无关,但它们解释了为什么在同一单元中姓氏相同的人有不同的条目..

以下是一些示例数据:

UNIT,SURNAME,FIRST_NAME,PHONE
1,Evans,Bob,12345
2,Smith,Jane,23456
2,Smith,Jim,23456
3,Jones,Joe,45678
4,Jones,Jason,98765
5,Wong,Bill,95147
5,Lee,Jane,95147

总结以上数据:

  • 鲍勃·埃文斯独自生活,
  • 简&吉姆史密斯住在同一个单位,并拥有相同的电话号码(但不同的电子邮件地址,因此单独的条目),
  • Joe Jones和Jason Jones,尽管有相同的姓氏,住在不同的单位,(显然)有不同的电话号码,
  • Bill Wong和Jane Lee住在一起,拥有相同的电话号码,但有不同的姓氏。

我想创建一个选择查询,该查询将生成一个电话列表(按姓氏排序),智能识别具有相同姓氏的两个人共享相同的电话号码(他们共享相同的单位号码的事实几乎可以假设,但我认为与实际的MySQL查询无关)并将它们组合成结果中的单行,同时留下不同姓氏但相同电话号码分开的人。换句话说,上述数据的选择结果如下所示:

UNIT,SURNAME,FIRST_NAME,PHONE
1,Evans,Bob,12345
4,Jones,Jason,98765
3,Jones,Joe,45678
5,Lee,Jane,95147
2,Smith,Jane & Jim,23456
5,Wong,Bill,95147

Some research引导我进行以下查询,几乎可以实现我的目标:

SELECT unit, surname, phone,
group_concat(first_name order by first_name SEPARATOR ' & ') AS name
FROM owners
GROUP BY surname;

然而,乔琼斯的电话和单位数字将Joe Jones和Jason Jones结合在一起:

3,Jones,Joe & Jason,45678

我想改进这个查询,以保持Joe Jones和Jason Jones拥有自己的电话号码。如果有帮助,每行都有一个主键“id”列。

欢迎任何建议或指示。非常感谢。

克雷格

2 个答案:

答案 0 :(得分:0)

我会尝试将unitphone列添加到group by子句中:

示例:

group by surname, unit

group by surname, phone

您还可以添加两列:

group by surname, unit, phone

答案 1 :(得分:0)

嗯我觉得有点不同,首先你需要按UNIT对其进行分组,然后为同一FIRST_NAME追加UNIT(如果有任何要追加的话),因为一个应该GROUP BY实际分隔行的列而不是可能将它们分开的列。

SELECT 
owners.unit, 
owners.surname, 
owners.phone, 
/* IF there is a second first_name from the join */ 
IF(LT.first_name IS NOT NULL, CONCAT(owners.first_name, ' & ', LT.first_name), owners.first_name)
FROM owners
/* JOIN the table again, based on the params below */ 
LEFT JOIN owners LT ON(LT.unit=owners.unit AND LT.first_name != owners.first_name)
GROUP BY owners.UNIT;

工作SQLFiddle