6

カラム name を含む MySQL のテーブルがありますcategory。それぞれから 2 つのランダムなレコードを返すクエリを作成しようとしていますcategory

これは、列categoryの値が最も高い2 つのレコードを取得するために使用するコードです。rating

SELECT e1.* 
FROM   entries AS e1 
WHERE  (SELECT Count(*) 
        FROM   entries AS e2 
        WHERE  e2.category = e1.category 
               AND e1.rating <= e2.rating) <= 2 
ORDER  BY category, 
          rating DESC 

このリンクをチェックして、いくつかのサンプル データと上記のクエリを含むテーブルを確認してください: http://sqlfiddle.com/#!9/bab8e/1

4

1 に答える 1

1

カテゴリ列と乱数でテーブルを並べ替えることで、目的の結果が得られました。次に、カテゴリが変更されるたびに 1 から始まる増分番号を各行に割り当てました。次に、rowNum が 2 以下の結果のみを返します。3 つのランダムな行を返したい場合は、それを 3 以下に変更するだけです。

SELECT entry_id, 
       category, 
       rating 
FROM   (SELECT @currank := IF(@category = category, @currank + 1, 1) AS rowNum, 
               @category := category                                 AS categoryVar, 
               e1.* 
        FROM   (SELECT *, 
                       (SELECT @currank := 0) r 
                FROM   entries 
                ORDER  BY category, 
                          Rand()) AS e1)AS e2 
WHERE  rownum <= 2 
ORDER  BY category, 
          rating; 

これは、質問に投稿したような sqlfiddle リンクです: http://sqlfiddle.com/#!9/bab8e/37/0


この同じクエリは、ランダムではないセット数のレコードを返すように簡単に調整できることに注意してください。たとえば、ratingそれぞれから上位 5 秒を返したい場合categoryは、

ORDER BY category,rand()

ORDER BY category, rating DESC

変化する

WHERE rownum <= 2

WHERE rownum <= 5

于 2012-12-14T18:35:09.270 に答える