У меня есть таблица к объектам (позволяет, называют их людьми), и свойства (у одного человека может быть произвольное число свойств). Исключая:
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
Также приемлемо возвратить одно из свойств и общего количества свойства.
Запрос должен быть эффективным: существуют миллионы строк у людей таблица, сотни тысяч строк в таблице свойств (таким образом, у большинства людей нет свойств). Существуют сотни строк, выбранных за один раз.
Там какой-либо путь состоит в том, чтобы сделать это?
Использование:
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, являющегося числовым значением, было бы лучшим выбором.
Вы можете использовать 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'