Внешнее соединение на основе 3 таблиц - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть три таблицы.Навыки (id), Users (id) и user_skills (user_id, skill_id).

Теперь я пробую левое внешнее соединение, например:

select * from skills left outer join user_skills ON skills.id = user_skills.skill_id;

Но оно не вернет мне то, что мне нужно, потому что нет проверки идентификатора пользователя.Если я сделаю:

select * from skills left outer join user_skills ON skills.id = user_skills.skill_id where user_skills.user_id = 986759322;

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

Однако я хочу вернуть все навыки определенного пользователя, независимо от того,этот навык обнаружен или нет.Итак, если навыкам 4, я хочу вернуть 4 строки, которые содержат информацию о навыке, а также информацию о пользователе, ЕСЛИ у пользователя есть этот навык.Если нет, эта информация будет нулевой, но вся информация о навыках будет там.

Как я могу сделать такой запрос?

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011
SELECT skills.id, IF(IS NULL user_skills.skill_id, 'Yes', 'No')
FROM skills
LEFT JOIN user_skills ON (
    skills.id = user_skills.skill_id AND 
    user_skills.user_id = 1234
)

Обратите внимание, что фильтрация по идентификатору пользователя выполняется в предложении ON, а не в WHERE. Это гарантирует, что вы получите навыки для этого конкретного пользователя плюс навыки, которых у него еще нет.

3 голосов
/ 13 апреля 2011

Установка проверки user_id в соединении должна помочь:

select * from skills 
left outer join user_skills 
  on skills.id = user_skills.skill_id
 and user_skills.user_id = 123   
0 голосов
/ 13 апреля 2011

почему вы не можете написать запрос вот так select * from skills left outer join user_skills ON skills.id = user_skills.skill_id where user_skills.user_id = skills.id;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...