SQL LEFT JOIN help - PullRequest
       8

SQL LEFT JOIN help

2 голосов
/ 15 июня 2010

Мой сценарий: Есть 3 таблицы для хранения информации о телешоу; сезон, эпизод и перевод эпизода.

Мои данные: Существует 3 сезона, по 3 эпизода в каждом, но есть перевод только для одного эпизода.

Моя цель: Я хочу получить список всех сезонов и эпизодов для шоу. Если есть перевод, доступный на указанном языке, покажите его, иначе покажите ноль.

Моя попытка получить информацию о серии 1 на языке 1:

    SELECT
     season_number AS season,number AS episode,name
    FROM
     season NATURAL JOIN episode
     NATURAL LEFT JOIN episode_trans
    WHERE
     id_serie=1 AND
     id_lang=1
    ORDER BY
     season_number,number

результат:

+--------+---------+--------------------------------+
| season | episode | name                           |
+--------+---------+--------------------------------+
|      3 |       3 | Episode translated into lang 1 | 
+--------+---------+--------------------------------+

ожидаемый результат

+-----------------+--------------------------------+
| season | episode| name                           |
+-----------------+--------------------------------+
|      1 |      1 | NULL                           |
|      1 |      2 | NULL                           |
|      1 |      3 | NULL                           |
|      2 |      1 | NULL                           |
|      2 |      2 | NULL                           |
|      2 |      3 | NULL                           |
|      3 |      1 | NULL                           |
|      3 |      2 | NULL                           |
|      3 |      3 | Episode translated into lang 1 |
+--------+--------+--------------------------------+

Полный дамп БД http://pastebin.com/Y8yXNHrH

Ответы [ 4 ]

2 голосов
/ 15 июня 2010

Я тестировал следующее на MySQL 4.1 - он возвращает ожидаемый результат:

   SELECT s.season_number AS season,
          e.number AS episode,
          et.name
     FROM SEASON s
     JOIN EPISODE e ON e.id_season = s.id_season
LEFT JOIN EPISODE_TRANS et ON et.id_episode = e.id_episode
                          AND et.id_lang = 1
    WHERE s.id_serie = 1
 ORDER BY s.season_number, e.number

Как правило, при использовании синтаксиса ANSI-92 JOIN необходимо указывать критерии объединения в предложении ON. В MySQL я знаю, что отсутствие этого для ВНУТРЕННИХ СОЕДИНЕНИЙ приводит к перекрестному соединению - декартову произведению.

2 голосов
/ 15 июня 2010
LEFT JOIN episode_trans
    ON episode_trans.id_episode = episode.id_episode
    AND episode_trans.id_lang = 1
WHERE id_serie=1
1 голос
/ 15 июня 2010

Можете ли вы попробовать использовать

LEFT OUTER JOIN

вместо

NATURAL LEFT JOIN
1 голос
/ 15 июня 2010

Возможно, вам нужно переместить id_lang = 1 в предложение LEFT JOIN вместо предложения WHERE.Подумайте об этом следующим образом ... для всех этих строк без перевода LEFT JOIN возвращает NULL для всех этих столбцов перевода.Затем в предложении WHERE вы проверяете, равно ли оно 1 - что, конечно, оценивается как FALSE.

Вероятно, было бы проще, если бы вы включили свой код в вопрос в следующий раз, а не в ссылку.

...