Pregunta

Tengo dos tablas 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 de usuario. user_id que reside en la tabla user_category_subscriptions.

gracias

¿Fue útil?

Solución

Debe colocarlo en la cláusula join , no en 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

Vea, con una unión interna , poner una cláusula en join o donde es equivalente. Sin embargo, con una unión externa , son muy diferentes.

Como condición de join , usted especifica el conjunto de filas que unirá a la tabla. Esto significa que primero evalúa user_id = 1 y toma el subconjunto de user_category_subscriptions con un user_id de 1 para unirse a todas las filas en categorías . Esto le dará todas las filas en categories , mientras que solo las categories a las que se ha suscrito este usuario en particular tendrán información en las user_category_subscriptions columnas Por supuesto, todas las demás categorías 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 una unión interna .

¡Espero que esto ayude!

Otros consejos

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top