MySQL unirse con la cláusula where
-
10-07-2019 - |
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
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