2

サンプルデータを含むテーブル「画像」:

id | user_id | album_id | sort

1     15         1         1
2     15         1         2
3     15         1         0
4     15         2         0
5     15         2         1
6     15         3         0 

MySQLクエリ:

SELECT id, sort, COUNT(*) FROM images WHERE user_id=15 GROUP BY album_id

クエリは、一意の組み合わせごとに1つの行を返します。ただし、どの行idが選択されているかをどのように判断できますか?たとえば、画像sort=0はアルバムのカバー画像です。この画像へのファイルパスには、が含まれていidます。では、どのようにして常に行のIDを取得することができsort=0ますか?

私は試しましたがMIN(sort)、これは常に列に返されますが0、そのsort列には適切idではありません...?ORDER BY sort結果を並べ替えるだけです...解決策でもありません。

どんな助けでも大歓迎です!事前にどうもありがとうございました!

編集:これがより良い理解に役立つことを願っています:

たとえば、クエリは次の結果を返します。

id | sort | count
1     1      3
4     0      2
6     0      1

sortしかし、の値がであるこの特定の行を常に取得するにはどうすればよい0でしょうか。例えば

id | sort | count
3     0      3
4     0      2
6     0      1
4

2 に答える 2

2

まず、表紙の画像(WHERE sort = 0)をフィルタリングしてから、そのすべての画像をカウントしますalbum_id

SELECT id, 
  sort,
  (SELECT COUNT(*) 
   FROM images t 
   WHERE t.album_id = i.album_id) AS count
FROM images i
WHERE user_id = 15
      AND sort = 0
于 2012-05-27T18:28:39.223 に答える
1

相関サブクエリなしでこれを行う方法があります。

SELECT id, sort, isum.cnt
FROM images i join
     (select i.album_id, count(*) as cnt
      from images
     ) isum
     on i.album_id = isum.album_id
WHERE user_id = 15 and
      sort = 0

私は通常、すべてのテーブルを「from」句にリストすることを好みます。ただし、album_idにインデックスがある場合、一部のデータベースはこの形式よりも相関サブクエリを最適化します。

また、3番目のフィールドの名前を「count」から「cnt」に変更しました。本当に必要な場合を除いて、SQLの予約語にちなんで列に名前を付けることは非常に悪い考えです。

そして最後に、SQLの他のほとんどの方言はウィンドウ関数をサポートしています。したがって、データベースを変更すると、次のようなことができます。

select id, sort, count(*) over (partition by album_id)
from images
where user_id = 15 and
      sort = 0
于 2012-05-27T22:10:55.063 に答える