MySQL - affiche des lignes de noms et d'adresses groupées par nom, où le nom apparaît plusieurs fois
-
05-07-2019 - |
Question
J'ai deux tables, " nom " et "adresse". Je souhaite répertorier le nom_du_film
et le code nom_du_filtre
de la table "nom". qui se produisent plus d'une fois dans la table "nom".
Les deux tables sont jointes dans la colonne "name_id".
La sortie désirée ressemblerait à ceci:
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 |
Notez que si le nom de famille "quot" est abernathy " n'apparaît qu'une fois dans la table "nom", puis "abernathy" ne doit pas être inclus dans le résultat.
C’est ce que j’ai trouvé jusqu’à présent:
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
Cependant, cela ne produit qu'une ligne par nom de famille. Je voudrais tous les noms de famille énumérés. Je sais que quelque chose de simple me manque. Toute aide est appréciée, merci!
La solution
Utiliser:
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
Autres conseils
Vous pouvez utiliser une sous-requête comme ci-dessous ou utiliser la même idée pour rejoindre une table dérivée si vous préférez.
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