У меня есть два стола, к которым я хочу присоединиться.
Мне нужны все категории в таблице категорий, а также все категории, на которые подписан пользователь, в таблице category_subscriptions.
по сути, это мой запрос:
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.
Спасибо
mysql
join
where-clause
mmundiff
источник
источник
Ответы:
Вам нужно указать это в
join
предложении, а не вwhere
:Смотрите, с помощью
inner join
вставки предложения вjoin
илиwhere
эквивалентно. Однако с anouter 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
.Надеюсь, это поможет!
источник
A
иB
стол? Вы можете перефразировать свой вопрос?Попробуй это
источник