MySQL junta-se à cláusula where

130

Eu tenho duas mesas em que quero entrar.

Desejo todas as categorias na tabela de categorias e também todas as categorias assinadas por um usuário na tabela category_subscriptions.

essencialmente, esta é a 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, eu quero adicionar uma cláusula where no final da consulta, que basicamente a torna uma junção interna / 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

Como obtenho todas as categorias e todas as categorias assinadas por um usuário específico usando apenas uma consulta?

category_id sendo uma chave na tabela de categorias e no user_category_subscriptions. user_id residente na tabela user_category_subscriptions.

obrigado

mmundiff
fonte
Eu acredito que é chamado de 'Junta certa' se não me engano?
Tyler Carter
@TylerCarter você certamente equivocada :)
Scooter daraf

Respostas:

287

Você precisa colocá-lo na joincláusula, não no 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 um inner join, colocando uma cláusula no joinou o whereé equivalente. No entanto, com um outer join, eles são muito diferentes.

Como joincondição, você especifica o conjunto de linhas que ingressará na tabela. Isso significa que ele avalia user_id = 1em primeiro lugar, e leva o subconjunto de user_category_subscriptionscom um user_idde 1juntar-se a todas as linhas categories. Isso fornecerá todas as linhas categories, enquanto apenas as categoriesque este usuário específico se inscreveu terão informações nas user_category_subscriptionscolunas. Obviamente, todos os outros categoriesserão preenchidos nullnas user_category_subscriptionscolunas.

Por outro lado, uma wherecláusula faz a juntar-se, e , em seguida, reduz o conjunto de linhas. Portanto, isso faz todas as junções e elimina todas as linhas onde user_idnão é igual 1. Você fica com uma maneira ineficiente de obter uma inner join.

Espero que isso ajude!

Eric
fonte
2
Bem colocada pergunta, e bem colocada resposta! economizei meu tempo. Muito obrigado!
Gaurav Phapale
1
Eu te amo tanto Eric, você me salvou de chorar: D
Raheel
Por outro lado, se eu quiser produzir dados limpos para os usuários, a segunda (onde) maneira é mais apropriada. Está correto ?
VLR
1
Oi, podemos chuck user_category_subscriptions.user_id é nulo. A fim de recuperar detalhes id em uma tabela que ter nulo id na tabela B
Veeresh123
@ Veeresh123, o que são Ae Btabela? Você pode reformular sua pergunta?
Istiaque Ahmed
11

Tente isto

  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
jaffarali
fonte
Se ainda estiver recebendo o mesmo erro ao usar este código, o que procuro a seguir.
precisa