我有一个小型的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
总结以上数据:
我想创建一个选择查询,该查询将生成一个电话列表(按姓氏排序),智能识别具有相同姓氏的两个人共享相同的电话号码(他们共享相同的单位号码的事实几乎可以假设,但我认为与实际的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”列。
欢迎任何建议或指示。非常感谢。
克雷格
答案 0 :(得分:0)
我会尝试将unit
或phone
列添加到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;