MySQL - отображать строки имен и адресов, сгруппированных по имени, где имя встречается более одного раза - PullRequest
0 голосов
/ 22 октября 2009

У меня есть две таблицы: «имя» и «адрес». Я хотел бы перечислить 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

Однако, это производит только одну строку на фамилию. Я хотел бы перечислить все фамилии. Я знаю, что мне не хватает чего-то простого. Любая помощь приветствуется, спасибо!

Ответы [ 3 ]

2 голосов
/ 22 октября 2009

Использование:

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
1 голос
/ 22 октября 2009

Вы можете использовать подзапрос, как показано ниже, или использовать ту же идею, чтобы присоединиться к производной таблице, если хотите.

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 голосов
/ 22 октября 2009
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
...