MySQL - отображать строки имен и адресов, сгруппированных по имени, где имя встречается более одного раза
-
05-07-2019 - |
Вопрос
У меня есть две таблицы: "имя" и "адрес".Я хотел бы перечислить следующие last_name
и присоединился address.street_address
из всех last_name
в таблице "имя", которые встречаются более одного раза в таблице "имя".
Две таблицы объединяются по столбцу "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" появляется только один раз в таблице "name", то "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
Однако при этом создается только одна строка для каждой фамилии.Я бы хотел, чтобы были перечислены все фамилии.Я знаю, что мне не хватает чего-то простого.Любая помощь приветствуется, спасибо!
Решение
Использование:
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