2009-08-07 124 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 

的問題是,我希望這個查詢不起作用,並且返回高的數字,而我只有一個數據庫中的幾張照片和分類。它返回如下所示的內容:

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

我們都假設SQL服務器 - 是否正確?什麼版本? – 2009-08-07 08:49:04

+0

對不起,這是MySQL ... – collimarco 2009-08-07 09:09:09

回答

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 2009-08-07 09:15:57

+0

因爲您沒有加入照片和分類,所以您基本上將它們交叉連接起來,爲每個分類選擇每張照片。如果用戶只能分類自己的照片,則可以將「AND C.PhotoId = P.Id」添加到分類連接中。 – 2009-08-07 10:27:01

1

我可能誤解你的模式,但不應該這樣:

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

是這樣的:

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

+0

這會假定所有分類都是針對相同的用戶照片。 – 2009-08-07 08:43:49

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