2009-10-22 50 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