0

私はMYSQLを使用しており、ランキングの目的でMYSQLの能力の範囲内で作業しようとしています。

私のクエリは次のとおりです。

    SELECT petz.s_name,
       petz.breed,
       a.num,
       sum(a.rank) AS rank
FROM wins_conf a
JOIN
  (SELECT DISTINCT rank
   FROM wins_conf
   ORDER BY rank DESC LIMIT 10) b ON a.rank = b.rank
JOIN petz ON a.num=petz.num
GROUP BY petz.num
ORDER BY petz.breed,
         rank DESC

結果を返します:

                                                                  sum(Rank)
INSANITY'S ACE OF SPADES           Collie          1026           58
INSANITY'S SAVE ME                 Collie          1000           31
STAR GAZER'S BEAUTIFUL LIES        Collie          1039           24
BANYON'S ALL IS FORGIVEN           Collie          1009           19
FELIXTOWE CHERRY BLOSSOM           Collie          1214           18
KE'S PRICELESS FIGUREINE           Collie          1004           13
NOVABLUE'S LOVES UNENDING LEGACY   Collie          1211           12
STAR GAZER'S WARRIOR OF MY HEART   Collie          1059            9
INSANITY'S BE MINE                 Collie          1028            9
STAR GAZER'S A WILDCAT'S REVENGE   Collie          1040            5
KE'S TRICKS OF THE TRADE           Collie          1005            5

record 1059 (STAR GAZER'S WARRIOR OF MY HEART) はランクとして 9 を返しますが、sum() されている DB 内のレコードに基づいて 12 になるはずです

                                                       Rank
conf    33    13    1059    Best of Breed    0    0    5    0   2
conf    78    3139  1059    Best of Breed    0    0    4    0   2
conf    82    2518  1059    Best of Breed    0    0    1    0   2
conf    81    13    1059    Best in Specialty0    0    1    0   2
conf    79    13    1059    Best of Breed    0    0    1    0   2

いくつかの調査で、1が4以上の場合、ランク列のsum()の最後の3レコードのみが表示されることがわかりました

これを修正する方法について何か提案はありますか?


AgRizzo への返信での編集/更新 読みやすくするために完全な名前と品種を削除しました。これが私が望んでいるものです。ランクを表示したいのですが、重複していますが、10 (重複を含む) のみです。

     num          rank
1    1026         58
2    1000         31
3    1039         24
4    1009         19
4    1214         19
5    1004         13
6    1211         12
6    1059         12
7    1028          9
8    1005          5
8    1040          5
9    1010          3
10    1276          1

ここでいくつかの基本データを設定します: http://sqlfiddle.com/#!2/7e2992 上記のように綿毛のコンテンツの一部が欠けていますが、そのコンテンツはランキング内では必要ありません。

4

3 に答える 3

0

これを試して

   select petz.s_name, petz.breed, a.num, sum(a.rank) as rank
   from wins_conf a
   JOIN petz ON a.num=petz.num 
   GROUP BY petz.num 
   ORDER BY petz.breed, rank DESC LIMIT 10
于 2013-10-09T18:05:17.640 に答える
0

ランキング付きバリエーションはこちら

SELECT s_name
    , breed
    , num
    , @denserank := IF(@prevrank = rank, @denserank, @denserank + 1 ) as DenseRank
    , @prevrank := rank AS rank
FROM (
  SELECT petz.s_name AS s_name
      , petz.breed AS breed
      , a.num AS num
      , sum(a.rank) as rank
  FROM wins_conf a
  JOIN petz 
    ON a.num=petz.num
  WHERE petz.breed = 'Collie' 
  GROUP BY petz.s_name, petz.breed, a.num
  ORDER BY petz.breed, rank DESC) AS temp1
JOIN (SELECT @prevscore := NULL, @denserank := 0) AS dummy
WHERE @denserank < 5

SQLFiddle http://sqlfiddle.com/#!2/7e2992/7にあります。データが限られているため、この例では上位 5 件をリストしています。それ以外の場合は、すべてのレコードが選択されます。WHERE 句を変更して、サイトのトップ 10 を一覧表示する

于 2013-10-11T12:46:15.870 に答える