4

まず、これをグーグルで検索しようとしましたが、この種の答えしか思いつきませんでした: MySQL - 選択時に行番号を取得する

私が必要とするのは、「特定のIDで行の位置を取得する」ことです。

上記のリンクの例で、「WHERE句」を追加しようとしましたが、「ランク」の結果は常に1でした。

したがって、テーブルに自動インクリメント id フィールドがあり、特定の順序ではない場合 (たとえば、id 2 がデータベースから削除されたため、id 1 が 2 ではなく 3 になった後)、たとえば id 4 の位置を取得するにはどうすればよいですか? ?

私が欲しいものを手に入れる方法はありますか?

4

6 に答える 6

1

これらのSQL Fiddleを見てください。

CREATE TABLE league_girl (position int, username varchar(10), score int);
INSERT INTO league_girl VALUES (1, 'a', 10);
INSERT INTO league_girl VALUES (2, 'b', 25);
INSERT INTO league_girl VALUES (7, 'c', 75);
INSERT INTO league_girl VALUES (10, 'd', 25);
INSERT INTO league_girl VALUES (16, 'e', 55);
INSERT INTO league_girl VALUES (17, 'f', 80);
INSERT INTO league_girl VALUES (27, 'g', 15);

そして、このクエリは私にそのrecord場所position = 17とその場所を教えてくれます6th Row Number

Select * from (SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r) as k
WHERE   k.position = 17;
于 2013-05-16T19:26:28.217 に答える
0

かなり似ているが、より一般的なものが必要でした。いくつかの順序句を含む選択クエリがあり、結果セット内の特定の ID の位置を見つける必要がありました。フィルタリングされた製品のリストと一連のフィルターを想像してください。必要なのは、製品がどのページにあるかを見つけることです。

Henrique Barcelos ソリューションに基づく:

元のクエリ:

SELECT * FROM mytable 
WHERE something = TRUE
ORDER BY 
    price ASC, 
    discount DESC, 
    catagory ASC

特定の ID の行クエリを検索:

SELECT COUNT(id) FROM mytable
WHERE something = TRUE
AND (
    price < 'myprice'
    OR (price = myprice AND discount > 'mydiscount')
    OR (price = myprice AND discount = 'mydiscount' AND category < 'mycategory')
)

最初の位置を取得する必要があるオブジェクトの と を取得する必要がmypriceありmydiscountます。mycategory

昇順の場合はより小さい (<)、降順の場合はより大きい (>) を使用できます。

このクエリは、アルゴリズムで簡単に生成できます。

@curRowまた、行をフェッチする必要がなく、インデックスのみから結果を計算できるため、変数を使用したソリューションよりもはるかにリソース効率が高くなります。

于 2014-07-15T15:02:44.183 に答える
0
SET @curRow = 0;
SELECT *, @curRow := @curRow + 1 row FROM `table`

実際の注文を値としてテーブルに保存する場合は、行などの新しい列を追加してから

set @curRow = 0;
update `table` set row = @curRow := @curRow + 1;

または、ギャップをクリアしたい場合は主キーを更新できます(IDを変更するために保存されている場合、たとえば、ソロテストテーブルの場合)

于 2016-11-05T20:06:18.000 に答える