2010-08-04 3 views
2

У меня есть табличные «плакаты», таблицы «отзывы» и «трейлеры» для таблиц. Каждая таблица связана с колонкой movieID, но каждая таблица может быть пустой для некоторого movieIDs:MySQL: OUTER JOIN и COUNT()

++ posters_table +++  ++ reviews_table ++  ++ trailers_table ++ 

--itemID--+--filename- --itemID--+--review-- --itemID--+--trailer 
---------------------- --------------------- --------------------- 
----001---+--0-- ----004---+--blalba-- ----002---+--002345-- 
----001---+--0013331-- ----004---+--xlalxa-- ----005---+--005434-- 
----002---+--0020052-- ----005---+--zlalza-- ----001---+--005335-- 

Я хочу COUNT() количества плакатов, отзывы и трейлеров для указанного movieID и получить 0, если не доступны ,

Так что, если я хочу, чтобы рассчитывать movieID = 001 я получаю: [ 'плакаты'] = 2/[ 'обзоры'] = 0 и [ 'трейлеры'] = 1 (к примеру)

Может кто-то пост SQL-запрос для этого?

ответ

3
select 
    (select count(*) from posters_table where itemId = ?) as posters, 
    (select count(*) from reviews_table where itemId = ?) as reviews, 
    (select count(*) from trailers_table where itemId = ?) as trailers; 
+0

Я не уверен, как мне нужно сохранить результаты. Я использую mysqli $ stmt-> bind_result ($ var); для получения результатов, но с этим SQL-запросом я не уверен, как его получить .. Любая помощь? – Jonathan

0

Я думаю, что если вы присоединитесь таблицу фильмов в результирующий набор, который дает отсчет, вы можете выбрать или нет счетчик> 0 и дать соответствующее значение:

SELECT movieID, IF(posters.posters_count > 0, posters.posters_count,0) AS posters_total, IF(reviews.reviews_count > 0, reviews.reviews_count,0) AS reviews_total, IF(trailers.trailers_count > 0, trailers.trailers_count,0) AS trailers_total 
FROM movies m 
LEFT JOIN (SELECT itemID,COUNT(*) AS posters_count FROM posters_table WHERE itemID = '001' GROUP BY itemID) posters ON posters.itemID = movies.movieID 
LEFT JOIN (SELECT itemID,COUNT(*) AS reviews_count FROM reviews_table WHERE itemID = '001' GROUP BY itemID) reviews ON reviews.itemID = movies.movieID 
LEFT JOIN (SELECT itemID,COUNT(*) AS trailers_count FROM trailers_table WHERE itemID = '001' GROUP BY itemID) trailers ON trailers.itemID = movies.movieID 
WHERE m.movieID = '001' 

EDIT: Я предпочитаю решение ar. Намного проще!

+1

Кроме того, вместо if, почему бы не просто «COALESCE (posters.posters_count, 0)»? Есть встроенная функция для противодействия значениям «NULL», поэтому почему бы не использовать их ... – ircmaxell

+0

Я не знал об этой функции. Очень хорошо. :) –

0
select 
    (select count(P.movieid) from posters P where P.movieid=1), 
    (select count(R.movieid) from reviews R where R.movieid=1), 
    (select count(T.movieid) from trailers T where T.movieid=1) 

Столы не «действительно» соединены, поэтому вам нужны три выбора.

+0

Я не уверен, как мне нужно сохранить результаты. Я использую mysqli $ stmt-> bind_result ($ var); для получения результатов, но с этим SQL-запросом я не уверен, как его получить .. Любая помощь? – Jonathan

+0

Я не думаю, что это работает. Это даст NULL вместо 0s. – Artefacto

+0

@Artefacto, вы в этом уверены? Я только что попробовал аналогичную вещь и всегда получаю нуль, чего я ожидаю от 'COUNT (*)'. –