1

次のクエリがあります。

SET @rownum := 0;
SELECT result.rank, result.postid FROM (                    
                SELECT CASE @rownum 

                WHEN 5 THEN  @rownum:=1 ELSE @rownum:=@rownum + 1  END AS rank
                    ,c.postid

                FROM comments c
                ORDER BY c.postid DESC
                ) as result

次の形式で結果を返します。

      rank               postid
    ---------------------------------
      1                    199
      2                    199
      3                    199
      4                    199
      5                    198
      1                    198
      2                    198
      3                    198
      4                    198
      5                    198
      6                    198

ここで、ランクが postid.postid 199 に従って指定されるように、このクエリを更新したいと考えました。199 は 1 から 4 にランク付けされ、新しい postid が表示されたことを識別するとすぐに、1 から任意の数のレコードに再びランク付けする必要があります。 id が含まれています。

I want the count of rank for each postid to start from 1 and goto the number of times that postid is appearing.

編集:

@lievenまだ問題が発生しています。この画像を確認してください。

ご覧のとおり、投稿は172終了していますが、ランクはまだ続いています

4

2 に答える 2

1

複数のフィールドで注文できます。

ORDER BY c.postid DESC, c.rank

最初のものが最も優先度が高くなります。

于 2012-10-25T07:47:44.707 に答える
0

次のステートメントを使用できますが、大きなテーブルではパフォーマンスが低下します。

レコードごとに、主キーが現在のレコードの値以下であるcountequal のランクとして取得する副選択が実行されます。postid100 個のレコードを返す場合、実質的に 101 個のステートメントが実行されたことになります。

SQL ステートメント (遅い)

>     SELECT c.postid    
>            , (SELECT COUNT(*) 
>               FROM   comments 
>               WHERE  postid = c.postid 
>                      AND tempid <= c.tempid
>              ) AS rank
>     FROM   comments c
>     ORDER BY
>            c.postid

SQL ステートメント (fast(er))

>     SET @rank := 1;
>     
>     SELECT  c1.postid
>             , CASE WHEN c1.postid= c2.postid 
>               THEN @rank := @rank + 1 
>               ELSE @rank := 1 
>               END AS Rank
>     FROM    (
>               SELECT  c.postid
>                       , @rownum1 := @rownum1 + 1 AS rownum
>               FROM    comments c, (SELECT @rownum1 := 1) r       
>               ORDER BY
>                       c.postid
>             ) c1
>             LEFT OUTER JOIN (
>               SELECT  c.postid
>                       , @rownum2 := @rownum2 + 1 AS rownum
>               FROM    comments c, (SELECT @rownum2 := 1) r       
>               ORDER BY
>                       c.postid
>             ) c2 ON c2.postid = c1.postid AND c2.rownum = c1.rownum - 1
>      ORDER BY
>             c1.postid
于 2012-10-25T08:21:53.573 に答える