MySQL объединяется с предложением where

103

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

Я хочу, чтобы все категории в таблице категорий, а также все категории, на которые подписал пользователь в таблице category_subscriptions.

по существу это мой запрос:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id

Это прекрасно работает, но я хочу добавить предложение where в конце запроса, которое по существу делает его соединением inner/equi.

   SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1

Как получить все категории, а также все категории, на которые подписывается конкретный пользователь, используя только один запрос?

category_id является ключом в таблице категорий и user_category_subscriptions. user_id, находящийся в таблице user_category_subscriptions.

спасибо

  • 0
    Я считаю, что это называется «Правильное соединение», если я не ошибаюсь?
  • 0
    @TylerCarter вы наверняка ошиблись :)
Теги:
join
where-clause

2 ответа

223
Лучший ответ

Вам нужно поместить его в предложение join, а не where:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON 
    user_category_subscriptions.category_id = categories.category_id
    and user_category_subscriptions.user_id =1

См., с inner join, размещение предложения в join или where эквивалентно. Однако при outer join они значительно отличаются.

Как условие join, вы указываете набор строк, с которым вы будете присоединяться к таблице. Это означает, что сначала он оценивает user_id = 1 и берет подмножество user_category_subscriptions с user_id of 1, чтобы присоединиться ко всем строкам в categories. Это даст вам все строки в categories, а только categories, на которые подписался этот конкретный пользователь, будет иметь любую информацию в столбцах user_category_subscriptions. Конечно, все остальные categories будут заполнены null в столбцах user_category_subscriptions.

И наоборот, предложение where делает соединение, а затем уменьшает набор строк. Таким образом, это делает все соединения, а затем удаляет все строки, где user_id не равно 1. У вас остался неэффективный способ получить inner join.

Надеюсь, это поможет!

  • 3
    +1 за блестящий объясненный ответ.
  • 1
    +1 за отличный ответ!
Показать ещё 9 комментариев
9

Попробуйте это

  SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1 
          or user_category_subscriptions.user_id is null
  • 0
    Если я все еще получаю ту же ошибку, используя этот код, что я буду искать дальше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню