2009-10-22 88 views
0

我有兩個表,「名稱」和「地址」。我想列出last_name並加入所有last_name在表「名稱」中出現多次的表「名稱」中的address.street_addressMySQL - 顯示按名稱分組的名稱和地址行,其中名稱發生多次

這兩個表被連接在「name_id」列上。

所需的輸出會出現像這樣:

213 | smith | 123 bluebird | 
14 | smith | 456 first ave | 
718 | smith | 12 san antonia st. | 
244 | jones | 78 third ave # 45 | 
98 | jones | 18177 toronto place | 

注意,如果姓氏「Abernathy的」表「名稱」中只出現一次,然後在「阿伯內西」不應該被包含在結果中。

這是我想出了迄今:

SELECT name.name_id, name.last_name, address.street_address, count(*) 
FROM `name` 
JOIN `address` ON name.name_id = address.name_id 
GROUP BY `last_name` 
HAVING count(*) > 1 

然而,這將產生每個姓氏只有一行。我想列出所有的姓氏。我知道我缺少一些簡單的東西。任何幫助表示讚賞,謝謝!

+0

我不禁大爲沒有什麼是每個table.My直覺列知道,uou'll需要做一個子查詢。 – 2009-10-22 00:23:22

回答

2

用途:

SELECT t.name_id, 
     t.last_name, 
     a.street_address 
    FROM NAME t 
    JOIN ADDRESS a ON a.name_id = t.name_id 
    JOIN (SELECT n.last_name 
      FROM NAME n 
     GROUP BY n.last_name 
     HAVING COUNT(*) > 1) nn ON nn.last_name = t.last_name 
+0

謝謝你這是非常有創意和完美的作品,我從來沒有見過像這樣的查詢。做得很好。 – Stoob 2009-10-22 05:57:33

0
SELECT name.name_id, name.last_name, address.street_address, count(name.last_name) as last_name_count 
FROM `name` 
JOIN `address` ON name.name_id = address.name_id 
HAVING last_name_count > 1 
+0

這需要一個GROUP BY子句,這樣做會導致它只爲每個名稱返回一行。 – 2009-10-22 00:41:40

+0

除非我在這個問題中遺漏了一些東西,他特別聲明他只想要列出多個姓氏的記錄。通過使用GROUP BY,姓氏限於單個結果。 – Jestep 2009-10-22 00:53:58

+0

您的陳述依然無效,因爲COUNT()沒有GROUP BY進行聚合。 OP想要返回包含不止一次出現的姓氏的每一行,而不僅僅是出現多次的(不同的)姓氏的列表。從另一個角度來看,他希望整個數據集不包括具有唯一姓氏的數據集。在主查詢中使用GROUP BY無法實現此目的。 – 2009-10-22 01:01:41

1

您可以像下面那樣使用子查詢,或者如果您願意,可以使用相同的想法加入派生表。

SELECT name.name_id, name.last_name, address.street_address 
FROM `name` 
JOIN `address` ON name.name_id = address.name_id 
WHERE name.name_id IN (
    SELECT GROUP_CONCAT(name.name_id) 
    FROM `name` 
    GROUP BY `last_name` 
    HAVING count(*) > 1 
) 
ORDER BY `last_name` 
+0

抱歉,這仍然只對每個姓氏生成一行,即使在「姓名」表格中可能存在該姓氏的幾行。謝謝。 Rexem說得對。 – Stoob 2009-10-22 05:58:27

+0

我明白爲什麼了。已修復它。 – 2009-10-22 09:42:18