MySQL-名前が複数回出現する名前とアドレスの行を名前別にグループ化して表示する
-
05-07-2019 - |
質問
" name"という2つのテーブルがあります。および「住所」。テーブル" name"のすべての last_name
の last_name
と結合された address.street_address
をリストしたいと思います。テーブル" name"で複数回発生します。
2つのテーブルは" 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 |
last_name" abernathy"がテーブル「名前」に1回だけ表示され、次に「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
ただし、これにより姓ごとに1行のみが生成されます。リストされているすべての姓が欲しい。シンプルなものが欠けていることは知っています。助けてくれてありがとう、ありがとう!
解決
使用:
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
他のヒント
次のようにサブクエリを使用するか、同じアイデアを使用して派生テーブルに結合することもできます。
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`
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
所属していません StackOverflow