MySQL: ограничение результатов, связанных с FROM, с объединениями, имеющими несколько подэлементов - PullRequest
1 голос
/ 13 января 2012

У меня есть главная таблица, из которой я выбираю, и таблица с подэлементами, из которых я выбираю в соединении. Пример:

person         skill           person_to_skill
id  | name     id | skill      id | p_id | s_id
------------   ------------    ----------------
1   | jim      1  | sewing     1  | 1    | 2
2   | peter    2  | cooking    2  | 2    | 1
3   | susan    3  | singing    3  | 2    | 3
4   | kevin                    4  | 3    | 1
                               5  | 3    | 2
                               6  | 4    | 3

Итак, теперь мы видим, что у сима есть только один навык, у Питера - два, и так далее. Теперь, если я выберу из лица, скилла koin, а затем присоединюсь к person_to_skill, но я хочу только двух человек. Как мне удается это сделать без группировки и, следовательно, не получить все навыки?

Коротко: я хочу выбрать двух человек из "человека" со всеми их навыками.

Я пытался просто использовать LIMIT , но это ограничивает строки результатов, а не людей. Если я использую GROUP BY , я получаю только один навык на человека. Возможно ли это без подвыбора?

Есть идеи у кого-нибудь?

Мой подход, измененный для работы с примером, выглядит следующим образом:

SELECT p.id,p.name,s.skill
FROM person AS p
LEFT JOIN person_to_skill psk ON (psk.p_id = p.id)
LEFT JOIN skill s ON (s.id = psk.s_id)
ORDER BY p.name
LIMIT 0,2

Ответы [ 2 ]

4 голосов
/ 13 января 2012

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

SELECT p.id,p.name,s.skill
FROM (select * from person ORDER BY name LIMIT 0,2) AS p
LEFT JOIN person_to_skill psk ON (psk.p_id = p.id)
LEFT JOIN skill s ON (s.id = psk.s_id)

Добавлено после комментария:

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

select id from person ORDER BY name LIMIT 0,2

, а затем используйте эти идентификаторы в следующем запросе:

SELECT p.id,p.name,s.skill
FROM person p
LEFT JOIN person_to_skill psk ON (psk.p_id = p.id)
LEFT JOIN skill s ON (s.id = psk.s_id)
WHERE p.id IN (ids from previous query)
1 голос
/ 13 января 2012

Вы можете сделать что-то вроде

SELECT p.id, p.name, group_concat(s.skill separator ',')

, а затем сгруппировать по человеку и ограничить количество строк.

...