2009-08-07 8 views
0

본인은 이러한 테이블이 있습니다복잡한 SQL 쿼리

나는 자신이 소유 + 분류 사진의 총 수에 의해 사용자를 주문하고 싶습니다
 
- Users 
    - id 
- Photos 
    - id 
    - user_id 
- Classifications 
    - id 
    - user_id 
    - photo_id 

.

나는이 쿼리를 썼다 :

 
SELECT users.id, 
COUNT(photos.id) AS n_photo, 
COUNT(classifications.id) AS n_classifications, 
(COUNT(photos.id) + COUNT(classifications.id)) AS n_sum 
FROM users 
LEFT JOIN photos ON (photos.user_id = users.id) 
LEFT JOIN classifications ON (classifications.user_id = users.id) 
GROUP BY users.id 
ORDER BY (COUNT(photos.id) + COUNT(classifications.id)) DESC 

문제는 내가 예상대로이 쿼리가 작동하지 않습니다 내가이 DB에서 몇 사진과 분류를 가지고있는 동안 높은 숫자를 반환합니다. 그러면 다음과 같이 반환됩니다 :

id n_photo n_classifications n_sum 
29 19241 19241     38482 
16 16905 16905     33810 
1 431  0      431 
...
+0

우리 모두 가정 SQL 서버있어 - 올바른? 어떤 버전입니까? –

+0

죄송합니다, 그것은 MySQL입니다 ... – collimarco

답변

3

당신은 구별이 없습니다.

SELECT U.ID, COUNT(DISTINCT P.Id)+COUNT(DISTINCT C.Id) Count 
    FROM User U 
    LEFT JOIN Photos P ON P.User_Id=U.Id 
    LEFT JOIN Classifications C ON C.User_Id=U.Id 
    GROUP BY U.Id 
    ORDER BY COUNT(DISTINCT P.Id)+COUNT(DISTINCT C.ID) 
+0

고마워! 이제는 모든 것이 제대로 작동합니다. 나는 여전히 의심이있다 : DISTINCT를 사용해야하는 이유는 무엇인가? 그것은 무엇을합니까? – collimarco

+0

사진과 분류간에 합류하지 않으므로 본질적으로 교차 분류에 가입하고 모든 분류에 대해 모든 사진을 선택합니다. 사용자가 자신의 사진 만 분류 할 수있는 경우 분류 결합에 'AND C.PhotoId = P.Id'를 추가 할 수 있습니다. –

1

나는 당신의 스키마를 잘못 해석 할 수 있지만, 안 :

LEFT JOIN classifications ON (classifications.user_id = users.id) 
         AND (classifications.photo_id = photos.id) 

:

LEFT JOIN classifications ON (classifications.user_id = users.id) 

이 수?

+0

이것은 모든 분류가 동일한 사용자 사진에 대한 것이라고 가정합니다. –

0
SELECT users1.id, users1.n_photo, users2.n_classifications 
FROM (
    SELECT users.id, COUNT(photos.id) AS n_photo 
    FROM users LEFT OUTER JOIN photos ON photos.user_id = users.id 
    GROUP BY users.id 
) users1 
    INNER JOIN (
    SELECT users.id, COUNT(classifications.id) AS n_classifications 
    FROM users LEFT OUTER JOIN classifications ON classifications.user_id = users.id 
    GROUP BY users.id 
) users2 ON users1.id = users1.id 
0

대신 이와 비슷한 더 많은 것을보십시오 :

SELECT users.id as n_id, 
(SELECT COUNT(photos.id) FROM photos WHERE photos.user_id = n_id) AS n_photos, 
(SELECT COUNT(classifications,id) FROM classifications WHERE classifications.user_id = n_id) AS n_classifications, 
(n_photos + n_classifications) AS n_sum 
FROM users 
GROUP BY n_id 
ORDER BY n_sum DESC