У меня есть две таблицы, к которым я хочу присоединиться.
Я хочу, чтобы все категории в таблице категорий, а также все категории, на которые подписал пользователь в таблице 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.
спасибо
Вам нужно поместить его в предложение 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
.
Надеюсь, это поможет!
Попробуйте это
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