2009-08-02 25 views
103

Tengo dos tablas a las que quiero unirme.MySQL join with where cláusula

Quiero todas las categorías en la tabla de categorías y también todas las categorías suscritas por un usuario en la tabla de categorías_subscripciones.

esencialmente esta es mi consulta hasta el momento:

SELECT * 
FROM categories 
LEFT JOIN user_category_subscriptions 
    ON user_category_subscriptions.category_id = categories.category_id 

Esto funciona bien sin embargo, quiero añadir una cláusula where en el final de la consulta, que luego hace esencialmente un interior/equi unirse.

SELECT * 
    FROM categories 
    LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id 
    WHERE user_category_subscriptions.user_id = 1 

¿Cómo obtengo todas las categorías, así como todas las categorías suscritas por un usuario en particular con una sola consulta?

category_id es una clave en ambas categorías table y user_category_subscriptions. user_id que reside en la tabla user_category_subscriptions.

gracias

+0

creo que se llama un 'derecho de Ingreso' si no me equivoco? –

+0

@TylerCarter seguramente te equivocas :) –

Respuesta

221

que necesita para poner en la cláusula join, no el 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 

Sede, con un inner join, poner una cláusula en el join o la where es equivalente. Sin embargo, con un outer join, son muy diferentes.

Como condición join, especifique el conjunto de filas que se unirá a la tabla. Esto significa que primero evalúa user_id = 1 y toma el subconjunto de user_category_subscriptions con user_id de 1 para unirse a todas las filas en categories. Esto le dará todas las filas en categories, mientras que solo el categories al que se ha suscrito este usuario particular tendrá información en las columnas user_category_subscriptions. Por supuesto, todos los demás categories se completarán con null en las columnas user_category_subscriptions.

Por el contrario, una cláusula where hace la unión, y luego reduce el conjunto de filas. Entonces, esto hace todas las uniones y luego elimina todas las filas donde user_id no es igual a 1. Te queda una forma ineficiente de obtener un inner join.

¡Espero que esto ayude!

+1

+1 por una respuesta brillante explicada. – simnom

+1

+1 para una gran respuesta! –

+2

¡Ponga la pregunta, y muy bien ponga la respuesta! me salvó el tiempo ¡muchas gracias! –

10

probar 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 
+0

Si sigo obteniendo el mismo error al usar este código, ¿qué busco a continuación? –