Sintaxis de MySQL Join para una relación de uno a muchos
Pregunta
Tengo una situación en la que tengo una tabla de títulos (t1) y otra tabla con enlaces múltiples que hacen referencia a estos títulos (t2) en una relación de uno a muchos.
Lo que quiero es la lista completa de títulos devueltos con una bandera que indica si hay un enlace específico asociado a ella.
Unirse a la izquierda y agrupar por:
SELECT
t1.id
, t1.title
, t2.link_id AS refId
FROM
t1
LEFT JOIN t2
ON (t1.id = t2.title_id)
GROUP BY t1.id;
Esto está cerca ya que me da el primer link_id o NULL en la columna refId.
Ahora, ¿cómo restrinjo los resultados si tengo un link_id específico en lugar de permitir que t2 se ejecute en todo el conjunto de datos?
Si agrego una cláusula WHERE, por ejemplo:
WHERE t2.link_id = 123
Solo obtengo los pocos registros donde coincide link_id, pero todavía necesito el conjunto completo de títulos devueltos con NULL en la columna refId a menos que link_id = 123.
Espero que alguien pueda ayudar
Solución
En lugar de en la cláusula WHERE, ponga sus criterios en la cláusula LEFT JOIN:
SELECT
t1.id
, t1.title
, t2.link_id AS refId
FROM
t1
LEFT JOIN t2
ON t1.id = t2.title_id AND t2.link_id = 123
GROUP BY t1.id;
Otros consejos
Póngalo en la condición de unión para la segunda tabla
SELECT t1.id, t1.title, t2.link_id as refId
FROM t1
LEFT JOIN t2 ON t1 = t2.title_id AND t2.link_id = 123
GROUP BY t1.id;