2015-11-07 2 views
0

У меня есть база данных фильмов, одна из таблиц - «категории», которая содержит все жанры, которые может иметь фильм в базе данных.Left Join не возвращает все строки в левой таблице

Запуск следующего запроса:

SELECT category.name FROM category 

возвращает строку:

Action 
Animation 
Children 
Classics 
Comedy 
Documentary 
Drama 
Family 
Foreign 
Games 
Horror 
Music 
New 
Sci-Fi 
Sports 
Travel 

Я пытаюсь запрос к базе данных, чтобы найти # каждый конкретный жанр конкретного актера играет роль в , но я хочу, чтобы он возвращал ВСЕ жанры с # в следующем столбце. Это был мой первоначальный запрос:

SELECT q1.name AS 'Film Category', COUNT(q2.name) AS '# of Films Ed Chase has appeared in' 
FROM (
    SELECT category.name FROM category 
) AS q1 
LEFT JOIN (
    SELECT category.name FROM category 
    INNER JOIN film_category ON film_category.category_id = category.category_id 
    INNER JOIN film ON film.film_id = film_category.film_id 
    INNER JOIN film_actor ON film.film_id = film_actor.film_id 
    INNER JOIN actor ON actor.actor_id = film_actor.actor_id 
    WHERE actor.first_name = 'ED' AND actor.last_name = 'CHASE' 
) AS q2 
ON q1.name = q2.name AND '# of Films Ed Chase has starred in' >= 0 
GROUP BY q2.name 
ORDER BY q2.name; 

И это возвращает эту таблицу, пропуская некоторые строки (я хочу, чтобы дать все жанры, а не только один это, что актер играет определенную роль в):

Film Category # of Films Ed Chase has appeared in 
Animation  0 
Action   2 
Classics  2 
Documentary  6 
Drama   3 
Foreign   2 
Music   1 
New    2 
Sci-Fi   1 
Sports   2 
Travel   1 

Интересно, что он возвратил '0' для 'Animation', но нет строк для 'Children' или 'Comedy', которые я искал (все возвращаемые жанры). Что я делаю не так?

+0

Ваше внутреннее соединение делает меня кроссовым, поэтому, вероятно, вы не делаете то, что хотите. Дайте мне несколько минут, чтобы попробовать переписать его. –

+0

Вы абсолютно уверены, что имя актера всегда в верхнем регистре? –

+0

Получил. Смотри ниже. –

ответ

1

COUNT() не считает NULL, а ваше левое соединение помещает NULL в записи, где в правой таблице нет значения. Ваше внешнее соединение на самом деле (или должно быть - проверьте это), возвращая все нужные строки, но внешний выбор с помощью агрегатной функции - это их.

Попробуйте переместить count() в правый подзапрос, а затем в своем внешнем запросе замените его IFNULL(q2.count, '0'), чтобы заменить NULL на нули.

Замечу, что вы должны группировать q1.name, а не q2.name.

+0

Я не уверен, как это не ответ. Это объясняет, почему он не получил желаемых результатов (кроме этого «0», которые он получил), и предлагает изменить запрос, который даст желаемый результат. –

+0

Никакие строки не были возвращены для детей или комедии. Здесь ничего нет, это исправит. – Strawberry

+0

Левое внешнее соединение между двумя подзапросами возвращает строки 'children | (NULL) 'и' комедия | (NULL) '. Вызов 'IFNULL' в самом внешнем запросе заменит эти нули нулями. –

Смежные вопросы