0

我正在一个带有图像和图像标签的网站上工作(à la Facebook)。图像在相册中。

DB结构的重要位如下

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

给定用户 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

有什么想法我可以做得更好吗?

4

3 回答 3

3

您可以在计数中添加 DISTINCT

IE:

   COUNT(DISTINCT photo.id),
   COUNT(DISTINCT tag.id)
于 2012-08-17T11:14:52.897 回答
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
于 2012-08-17T11:16:29.410 回答
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 
于 2012-08-17T13:11:01.900 回答