Синтаксис MySQL Join для отношения один ко многим - PullRequest
8 голосов
/ 02 августа 2009

У меня есть ситуация, когда у меня есть одна таблица заголовков (t1) и другая таблица с несколькими ссылками, которые ссылаются на эти заголовки (t2) в отношении один ко многим.

Мне нужен полный список заголовков, возвращаемых с флагом, указывающим, связана ли с ним определенная ссылка.

Соединение влево и группировка по:

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;

Это близко, поскольку дает мне либо первый link_id, либо NULL в столбце refId.

Теперь, как мне ограничить результаты, если у меня есть конкретный link_id вместо того, чтобы позволить t2 проходить через весь набор данных?

Если я добавлю предложение WHERE, например:

WHERE t2.link_id = 123

Я получаю только несколько записей, где совпадает link_id, но мне все еще нужен полный набор заголовков, возвращаемых с NULL в столбце refId, если link_id = 123.

Надеюсь, кто-то может помочь

Ответы [ 2 ]

13 голосов
/ 02 августа 2009

Вместо предложения WHERE поместите свои критерии в предложение 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;
4 голосов
/ 02 августа 2009

Поместите его в условие соединения для второй таблицы

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