2012-08-17 66 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