MySQL unir-se a cláusula WHERE
-
10-07-2019 - |
Pergunta
Eu tenho duas tabelas Eu quero participar.
Eu quero todas as categorias na tabela de categorias e também todas as categorias subscritas por um usuário na tabela de category_subscriptions.
Essencialmente, este é minha consulta até agora:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
Isso funciona bem no entanto gostaria de acrescentar uma cláusula onde no final da consulta que, em seguida, essencialmente torna um interior / equi participar.
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
WHERE user_category_subscriptions.user_id = 1
Como faço para obter todas as categorias, bem como todas as categorias subscritas por um determinado usuário usando apenas uma consulta?
category_id ser uma chave em ambos tabela de categorias e user_category_subscriptions. user_id residente na tabela de user_category_subscriptions.
graças
Solução
Você precisa colocá-lo na cláusula join
, não o 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
Veja, com uma inner join
, colocando uma cláusula no join
ou o where
é equivalente. No entanto, com um outer join
, eles são muito diferentes.
Como condição join
, você especifica o conjunto de linhas que você irá juntar-se à mesa. Isso significa que ele avalia user_id = 1
primeiro, e leva o subconjunto de user_category_subscriptions
com um user_id
de 1
para se juntar a todas as linhas em categories
. Isto lhe dará todas as linhas em categories
, enquanto apenas o categories
que este usuário em particular subscreveu terá qualquer informação nas colunas user_category_subscriptions
. Naturalmente, todos os outros categories
será preenchida com null
nas colunas user_category_subscriptions
.
Por outro lado, uma cláusula where
faz a junção, e então reduz o conjunto de linhas. Então, isso faz todo o une e depois elimina todas as linhas onde user_id
não é igual 1
. Você é deixado com uma forma ineficiente para obter uma inner join
.
Esperamos que isso ajude!
Outras dicas
Tente este
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