2012-08-17 65 views
0

我正在使用圖像上的圖像和標籤(àla Facebook)的網站上工作。圖像在相冊中。有多個連接的多個計數

數據庫結構的重要位如下

user: id INT 
album: id INT, user_id INT 
photo: id INT, album_id INT 
tag: id INT, photo_id 

我試圖得到一個電話的工作是會回來,給定一個USER_ID,相冊ID,在該照片的總數專輯,以及該專輯中的全部標籤。

它工作得很好,以獲得總照片或總標籤,但不是兩個。在這種情況下,它會返回兩次標籤總數。

以下是我的SQL調用:

SELECT album.id, COUNT(photo.id), COUNT(tag.id) 
FROM album 
LEFT OUTER JOIN photo ON (album.id = photo.album_id) 
LEFT OUTER JOIN tag ON (photo.id = tag.photo_id) 
WHERE album.user_id = 123 GROUP BY album.id 
ORDER BY album.id DESC LIMIT 0,25 

任何想法如何,我可以做得更好?

+2

你真的加入到照片的兩倍,或者是一個錯字? – podiluska 2012-08-17 11:15:12

+1

類似的問題:[MySQL多個SUM返回相同的值](http://stackoverflow.com/questions/11787323/mysql-multiple-sum-returning-same-value) – 2012-08-17 11:18:03

+0

@ podiluska是的,錯字! – Richard 2012-08-17 11:28:08

回答

3

你可以添加一個DISTINCT到計數

即:

COUNT(DISTINCT photo.id), 
    COUNT(DISTINCT tag.id) 
2
SELECT 
    album.id AS album_id, 
    COUNT(DISTINCT photo.id) AS count_photos, 
    COUNT(DISTINCT tag,id) AS count_tags 
FROM album 
LEFT JOIN photo ON album.id=photo.album_id 
LEFT JOIN photo ON photo.id=tag.photo_id 
WHERE album.user_id = 123 
GROUP BY album.id 
1

,你必須是因爲你沿着兩個不同的維度,照片和標籤加入的問題。儘管COUNT(DISTINCT)可用於計數,但您也可能需要彙總其他信息。

更普遍的方法是將結果分爲子查詢:

SELECT a.id, NumPhotos, NumTags 
FROM (select album.id, count(*) as NumPhotos 
     from album LEFT OUTER JOIN 
      photo 
      ON (album.id = photo.album_id) 
    ) a LEFT OUTER JOIN 
    (select album.id, count(*) as NumTags 
     from album LEFT OUTER JOIN 
      photo 
      ON (album.id = photo.album_id) LEFT OUTER JOIN 
      tag 
      ON (photo.id = tag.photo_id) 
    ) b 
    on a.id = b.id 
WHERE a.user_id = 123 
ORDER BY a.id DESC 
LIMIT 0,25