2010-08-04 103 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