0

私は画像と画像上のタグがあるサイトで作業しています(àlaFacebook)。画像はアルバムにあります。

DB構造の重要な部分は次のとおりです

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

user_id、アルバムID、そのアルバムの写真の総数、およびそのアルバムのタグの総数が与えられた場合に返される呼び出しを機能させようとしています。

写真の合計またはタグの合計のいずれかを取得できますが、両方を取得することはできません。その場合、タグの総数を2回返します。

以下は私の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 を追加できます

すなわち:

   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

問題は、写真とタグという 2 つの異なる次元に沿って結合しているためです。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 に答える