2015-05-06 3 views
3

Ниже представлен мой код. Он возвращает подсчет каждой категории, в которой находился человек для фильма. Он возвращает результат, но я бы хотел, чтобы он перечислял каждую категорию, включая те, у которых 0 счетчиков. Я пробовал каждую комбинацию LEFT JOIN, OUTER JOIN и т. Д., И это все еще не работает. Любая помощь будет оценена!Включая 0 Включить подсчет при фильтрации по SQL

SELECT c.name, COUNT(f.title) FROM category c 
LEFT JOIN film_category fc ON c.category_id = fc.category_id 
INNER JOIN film f ON fc.film_id = f.film_id 
INNER JOIN film_actor fa ON f.film_id = fa.film_id 
INNER JOIN actor a ON fa.actor_id = a.actor_id 
WHERE a.first_name = 'Jack' AND a.last_name = 'Daniel' 
GROUP BY c.name ASC; 
+0

Возможно, '... sum (if (name is null, 1, 1)) ...' вместо count может работать. – geoB

+0

Я знаю, что ваша настройка схемы и запрос кажутся очень сложными, но это в основном та же проблема. Любой, кто хочет выбрать категории с 0 элементами в нем, столкнулся бы с SQL в типичной модели ER. Так что ответ есть http://stackoverflow.com/questions/12177444/sql-query-to-get-empty-categories-too Я считаю, что вам нужно изменить свой первый INNER JOIN на LEFT JOIN, но это очень много настроить и проверить для меня. – braks

+0

Измените все 'внутренние соединения' на' left joins' и переместите критерии 'where' в соединения ... – sgeddes

ответ

-1

Союз обратные критерии запроса, например

SELECT c.name, COUNT(f.ti.... 
... 

UNION 

SELECT c.name, 0 
FROM category c 
... 
WHERE NOT(a.first_name = 'Jack' AND a.last_name = 'Daniel') 
... 
1

Попробуйте это. SQL Fiddle demo

SELECT c.name, COUNT(f.title) FROM category c 
LEFT JOIN film_category fc ON c.category_id = fc.category_id 
LEFT JOIN film f ON fc.film_id = f.film_id 
LEFT JOIN film_actor fa ON f.film_id = fa.film_id 
LEFT JOIN actor a ON fa.actor_id = a.actor_id and a.first_name = 'Jack' AND a.last_name = 'Daniel' 
WHERE 1=1 
GROUP BY c.name ASC; 
+1

Это было предложение WHERE, которое убивало Solomon, - которое автоматически отфильтровывало« несоответствующие »строки. Переместив селектор имен в критерии соединения, база данных смогла вернуть все строки категорий, соответствующие или нет. Отлично сработано! – Curt

+1

Если film.title не объявлен 'NOT NULL', вы должны вместо этого' COUNT (f.film_id) 'избежать фильма с нулевым заголовком, который не подсчитывается. –

+0

Привет @Solomon, если этот или любой ответ решил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), нажав на галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – WorkSmarter

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