テーブルに自動インクリメント列/キーがない場合、行 IDSELECT
で並べ替えられた結果を取得するにはどうすればよいですか?
さらに、自動インクリメント行が存在しないため、句をLIMIT
使用できない場合、たとえば最後の 100 個を取得するにはどうすればよいですか?ORDER BY
テーブルに自動インクリメント列/キーがない場合、行 IDSELECT
で並べ替えられた結果を取得するにはどうすればよいですか?
さらに、自動インクリメント行が存在しないため、句をLIMIT
使用できない場合、たとえば最後の 100 個を取得するにはどうすればよいですか?ORDER BY
select * from <table_name> order by _rowId;
リレーショナル データベースには、並べ替え順序や最初または最後の行はありません。特定の順序が必要な場合は、ORDER BY
句で列を指定する必要があります。単純に 500 回連続で同じ結果が得られるかもしれませんがSELECT whatever FROM yourTable
、インデックスが再構築されたり、単純に行が追加されたりすると、その動作が急速に変化する可能性があります。
次のアプローチを試すことができますが、希望どおりに機能するという保証はまったくありません。
SET @rownum:=0;
SELECT *
FROM (SELECT @rownum:=@rownum+1 as rownum,
*
FROM yourTable) t1
ORDER BY rownum DESC
LIMIT 100;
テーブルに一意の ID がない場合、並べ替えは常に厄介な問題になることに注意してください。物事が表示される順序を知ることはできません。(つまり、信頼できない!)
これ(以下を参照)は機能しますが、ちょっと遅いです...
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;
質問したいテーブル スキーマとサンプル クエリを確認せずに、質問に答えることは困難です。特に、ソート順が指定されていない場合、「最後の 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;