2010-08-04 4 views
2

테이블 '포스터', 테이블 '리뷰'및 테이블 '예고편'이 있습니다. 모든 테이블은 movieID 칼럼과 연결되어 있지만, 각 테이블은 특정 movieIDs에 대한 비어있을 수 있습니다 내가) (지정된 movieID에 대한 포스터, 리뷰와 트레일러의 수를 계산없이 가능한 경우 0을 얻고 싶은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-- 

.

그래서 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

나는 이것이 작동한다고 생각하지 않는다. 0 대신 NULL을 제공합니다. – Artefacto

+0

@Artefacto, 당신은 그것에 대해 꽤 확신합니까? 난 그냥 비슷한 일을 시도하고 항상 'COUNT (*)'에서 기대하는 것입니다 제로가. –