Соединение MySQL с предложениемwhere
-
10-07-2019 - |
Вопрос
У меня есть две таблицы, к которым я хочу присоединиться.
Мне нужны все категории в таблице категорий, а также все категории, на которые подписан пользователь, в таблице категории_подписок.
по сути, это мой запрос:
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