1

テーブルに自動インクリメント列/キーがない場合、行 IDSELECTで並べ替えられた結果を取得するにはどうすればよいですか?

さらに、自動インクリメント行が存在しないため、句をLIMIT使用できない場合、たとえば最後の 100 個を取得するにはどうすればよいですか?ORDER BY

4

5 に答える 5

1

select * from <table_name> order by _rowId;

于 2014-08-28T02:34:44.647 に答える
1

リレーショナル データベースには、並べ替え順序や最初または最後の行はありません。特定の順序が必要な場合は、ORDER BY句で列を指定する必要があります。単純に 500 回連続で同じ結果が得られるかもしれませんがSELECT whatever FROM yourTable、インデックスが再構築されたり、単純に行が追加されたりすると、その動作が急速に変化する可能性があります。

于 2013-09-16T17:19:47.753 に答える
1

次のアプローチを試すことができますが、希望どおりに機能するという保証はまったくありません。

SET @rownum:=0;

SELECT *
FROM (SELECT @rownum:=@rownum+1 as rownum,
             *
      FROM yourTable) t1
ORDER BY rownum DESC
LIMIT 100;

テーブルに一意の ID がない場合、並べ替えは常に厄介な問題になることに注意してください。物事が表示される順序を知ることはできません。(つまり、信頼できない!)

于 2013-09-16T17:18:46.297 に答える
0

これ(以下を参照)は機能しますが、ちょっと遅いです...

SET @last = 100;
SET @ofst = (SELECT COUNT(*) FROM table) - @last;
SET @stmt = CONCAT('SELECT * FROM table LIMIT ', @ofst, ', ', @last);
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-09-16T19:18:01.780 に答える
0

質問したいテーブル スキーマとサンプル クエリを確認せずに、質問に答えることは困難です。特に、ソート順が指定されていない場合、「最後の 500」が何を意味するのか想像するのは困難です。とにかく一貫性が保証されていないのに、なぜ「最初の」100 ではなく「最後の」100 を気にするのでしょうか?

1)Marty McVryが提案したように、インクリメント変数を使用してクエリに行番号を追加できます(またはmysql でインクリメントカウンターを選択するか、MySQLクエリのすべての行にシーケンス番号が必要など)。

2)現在の自然な順序を維持したい場合は、テーブルに自動インクリメント 'id' 列を追加し、上記のようにインクリメント変数を使用して行を更新し、AUTOINCREMENT. そうすれば、今後この列で一貫して注文できるようになります。

3) 最後に、ギミックとして、インクリメント変数を使用せずに「最後の 100」を取得しようとしましたが、ストアド プロシージャなしでは実際には不可能です。これらのタイプのクエリはどちらも機能しません。

SELECT * FROM t LIMIT count(*)-100,100;

SELECT @n := count(*) FROM t;
SELECT * FROM t LIMIT @n-100, 100;
于 2013-09-16T17:56:13.107 に答える