MySQL junta-se à cláusula where

Eu tenho duas tabelas que quero participar.

Eu quero todas as categorias na tabela de categorias e também todas as categorias inscritas por um usuário na tabela category_subscriptions.

essencialmente esta é 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, em seguida, essencialmente faz com que seja uma junit 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 faço para obter todas as categorias, bem como todas as categorias inscritas por um usuário específico usando apenas uma consulta?

category_id é uma chave na tabela de categorias e nas user_category_subscriptions. user_id que reside na tabela user_category_subscriptions.

obrigado

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

    Como uma condição de join , você especifica o conjunto de linhas que será associado à tabela. Isso significa que ele avalia user_id = 1 primeiro e pega o subconjunto de user_category_subscriptions com um user_id de 1 para unir todas as linhas nas categories . Isso fornecerá todas as linhas em categories , enquanto apenas as categories que esse usuário específico se inscreveu terão informações nas colunas user_category_subscriptions . Naturalmente, todas as outras categories serão preenchidas com null nas colunas user_category_subscriptions .

    Por outro lado, uma cláusula where faz a associação e, em seguida, reduz o conjunto de linhas. Então, isso faz todas as junções e elimina todas as linhas onde user_id não é igual a 1 . Você fica com uma maneira ineficiente de obter uma inner join .

    Espero que isso ajude!

    Tente isso

      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