Вопрос

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

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

по сути, это мой запрос:

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

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

   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.

Спасибо

Это было полезно?

Решение

Вам нужно поместить его в 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 из 1 присоединиться ко всем строкам в categories.Это даст вам все строки в categories, в то время как только categories на которую подписался этот конкретный пользователь, будет иметь любую информацию в user_category_subscriptions столбцы.Конечно, все остальные categories будет заполнен null в user_category_subscriptions столбцы.

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

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

Другие советы

Попробуй это

  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top