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

¿Fue útil?

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