Соедините одну строку с несколькими строками в другой таблице

У меня есть таблица к объектам (позволяет, называют их людьми), и свойства (у одного человека может быть произвольное число свойств). Исключая:

Люди

Name  Age
--------
Jane  27
Joe   36
Jim   16

Свойства

Name   Property
-----------------
Jane   Smart
Jane   Funny
Jane   Good-looking
Joe    Smart
Joe    Workaholic
Jim    Funny
Jim    Young

Я хотел бы записать эффективный выбор, который выберет людей на основе возраста и возвратит все или некоторые их свойства.

Ex: People older than 26
Name Properties
Jane Smart, Funny, Good-looking
Joe Smart, Workaholic

Также приемлемо возвратить одно из свойств и общего количества свойства.

Запрос должен быть эффективным: существуют миллионы строк у людей таблица, сотни тысяч строк в таблице свойств (таким образом, у большинства людей нет свойств). Существуют сотни строк, выбранных за один раз.

Там какой-либо путь состоит в том, чтобы сделать это?

22
задан Ghostrider 23 May 2010 в 19:11
поделиться

2 ответа

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

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
LEFT JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

Вы хотите, чтобы функция MySQL GROUP_CONCAT ( документация ) возвращала список значений PROPERTIES.property, разделенных запятыми.

Я использовал LEFT JOIN, а не JOIN, чтобы включить записи PEOPLE, у которых нет значения в таблице PROPERTIES - если вам нужен только список людей со значениями в таблице PROPERTIES, используйте:

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
     JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

Я понимаю, что это пример, но использование имени - плохой выбор для ссылочной целостности, если учесть, сколько существует «Джона Смита». Назначение user_id, являющегося числовым значением, было бы лучшим выбором.

25
ответ дан 29 November 2019 в 05:13
поделиться

Вы можете использовать INNER JOIN , чтобы связать две таблицы вместе. Подробнее о JOINs .

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.Name = P.Name
WHERE P.Name = 'Joe' -- or a specific age, etc

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

Скажем, таблица People имеет поле id
А таблица Properties имеет поле peopleId , чтобы связать их вместе

Тогда запрос будет выглядеть примерно так:

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.id = P.peopleId
WHERE P.Name = 'Joe'
3
ответ дан 29 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: