2016-12-04 66 views
0

我有一個小型的超過100位居民的MySQL數據庫,我住在這個複雜的地方。爲了簡化,它包含單元號碼,姓氏,名字,電話號碼和電子郵件地址。電子郵件地址是不相關的問題,但他們解釋爲什麼人們在同一單位同一姓氏有不同的條目..在MySQL中智能組合重複行選擇結果

下面是一些樣本數據:

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 

綜上所述數據:

  • 鮑勃埃文斯住在他自己的,
  • 簡&吉姆·史密斯一起住在同一個單元,並具有相同的電話號碼(但不同的電子郵件地址,因此分隔符Ë項),
  • 喬 - 瓊斯和賈森·瓊斯,儘管共享同一個姓,住在不同的單位,(顯然)有不同的電話號碼,並
  • 比爾Wong和李正住在一起,並具有相同的電話號碼,但有不同的姓氏。

我想創建一個選擇查詢,將生成(按姓氏排序)一個電話列表,能夠智能識別出兩個人共享同一電話號碼(即它們共享相同的單元號是事實同姓假設很多,但我認爲與實際的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 

Someresearch導致我下面的查詢幾乎做什麼,我想:

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

然而,結合喬·瓊斯和賈森·瓊斯在喬·瓊斯的電話和單元號:

3,Jones,Joe & Jason,45678 

我想細化查詢,以保持喬·瓊斯和賈森·瓊斯他們自己的單獨條目與他們自己的電話號碼。如果有幫助,每行都有一個主鍵「id」列。

任何建議或指針將受到歡迎。非常感謝。

克雷格

回答

0

我想嘗試的unitphone列添加到group by條款:

例子:

group by surname, unit

group by surname, phone

您還可以同時添加專欄:

group by surname, unit, phone

+0

感謝akrys,但這正是我需要的。我將在我用來生成實際列表的腳本中按正確順序獲取列。 – CraigH

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

+0

非常感謝Max。不幸的是,您的SQL結合了Bill Wong和Jane Lee,他們因爲他們的姓氏不同而在結果中保持分離。結果按單位數排序;按照姓氏修復進行分組,但是當我嘗試僅選擇那些真正想要在電話列表中的業主時(在我原來的問題中沒有包含這個變量的話,那麼在SQL中引入「where」子句會導致問題,所以我知道它不在你的解決方案中)。 – CraigH