MySQL unirse con la cláusula where

130

Tengo dos mesas a las que me quiero unir.

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 category_subscriptions.

esencialmente esta es mi consulta hasta ahora:

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

Esto funciona bien, sin embargo, quiero agregar una cláusula where al final de la consulta, que esencialmente lo convierte en una unión 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

¿Cómo obtengo todas las categorías y todas las categorías suscritas por un usuario en particular usando solo una consulta?

category_id es una clave tanto en la tabla de categorías como en las suscripciones de categoría_usuario. user_id que reside en la tabla user_category_subscriptions.

Gracias

mmundiff
fuente
¿Creo que se llama 'Unión correcta' si no me equivoco?
Tyler Carter el
@TylerCarter seguramente te equivocaste :)
Scooter Daraf

Respuestas:

287

Debe ponerlo en la joincláusula, 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

Ver, con un inner join, poner una cláusula en el joino el wherees equivalente. Sin embargo, con un outer join, son muy diferentes.

Como joincondición, especifique el conjunto de filas que unirá a la tabla. Esto significa que se evalúa user_id = 1en primer lugar, y toma el subconjunto de user_category_subscriptionscon una user_idde las 1que se unen para todas las filas en categories. Esto le dará todas las filas categories, mientras que solo las categoriesque este usuario en particular se haya suscrito tendrán información en las user_category_subscriptionscolumnas. Por supuesto, todos los demás categoriesse completarán nullen las user_category_subscriptionscolumnas.

Por el contrario, una wherecláusula 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_idno es igual 1. Te queda una forma ineficiente de obtener un inner join.

¡Ojalá esto ayude!

Eric
fuente
2
Muy bien formulado pregunta, y muy bien formulado respuesta! me salvó el tiempo ¡muchas gracias!
Gaurav Phapale
1
Te amo tanto Eric que me salvaste de llorar: D
Raheel
Por otro lado, si quiero producir datos limpios para los usuarios, la segunda (dónde) es más apropiada. Es correcto ?
vlr
1
Hola, podemos tirar user_category_subscriptions.user_id es nulo. Para recuperar la identificación detallada en la tabla A que tiene una identificación nula en la tabla B
Veeresh123
@ Veeresh123, ¿qué son Ay Bmesa? ¿Puedes reformular tu pregunta?
Istiaque Ahmed
11

Prueba esto

  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
fuente
Si sigo recibiendo el mismo error al usar este código, ¿qué debo buscar a continuación?
Jack Franzen