2010-08-04 102 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 2010-08-04 13:02:41

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' 

编辑:我更喜欢ar的解决方案。简单得多!

+1

此外,而不是如果,为什么不只是'COALESCE(posters.posters_count,0)'?有一个内置的函数来计数NULL值,所以为什么不使用它... – ircmaxell 2010-08-04 12:53:45

+0

我不知道这个功能。非常好。 :) – 2010-08-04 13:00:28

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 2010-08-04 13:03:56

+0

我不认为这有效。它会给NULL而不是0。 – Artefacto 2010-08-04 14:22:03

+0

@Artefacto,你确定吗?我刚刚尝试过类似的东西,总是得到零,这正是我期望从“COUNT(*)”得到的结果。 – 2010-08-04 14:52:30