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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top