MySQLの最後の行を選択


181

SELECTMySQLテーブルの最後の行はどうすればよいですか?

私はしていINSERTたデータをすると、私は前の行から列の値を取得する必要があります。

ありますauto_incrementテーブルでは。


8
「最後の行」を定義します。最高のIDを持つもの?または最近追加されたものですか?
EboMike、2011年

1
最後の行を示すもの-テーブルにauto_incrementまたはDATETIME列がありますか?
OMGポニー2010年

はい、そこauto_incrementにあります。最近追加したものをお願いします。
10

9
EboMikeとOMG Poniesが言ったように、セットの最後の行はありません。ボールがいっぱい入ったバッグを渡して、最後のボールを渡してほしいと頼んだらどうしますか?
Vincent Savard、2010年

回答:


402

はい、そこにauto_incrementがあります

テーブルのすべての行の最後が必要な場合は、これが最終的MAX(id)に正しい答えが得られるタイミングです。やや:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
何百万もの行をソートする必要がある場合、これは遅くなると思いませんか?
Slawa

2
これを2,000万行以上実行しただけで、非常に高速でした。このクエリを処理するための特別なケースがあると思います。(編集:MySQL 5.7、InnoDBエンジン)
Daniel Buckmaster 2018年

1
@ペッカ:私は注文を使いたくないのですが、それを行う他のオプションはありますか?
シバ

4
@Slawa idインデックスが作成されている場合。
ローンの侯爵

31

リレーショナルデータベースのテーブルは単なる行のセットであることに注意してください。そして、数学の集合は順序付けられていないコレクションです。最初または最後の行はありません。前の行も次の行もありません。

最初に、順序付けられていない行のセットを何らかのフィールドでソートする必要があります。その後、定義した順序で結果セットを繰り返し処理できます。

自動インクリメントフィールドがあるので、それを並べ替えフィールドにしたいと思います。その場合は、次の操作を実行できます。

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

順序付けされていない行のセットをyour_auto_increment_field(またはそれが呼び出したもの)で降順で最初に並べ替える方法を確認します。次に、結果セットを最初の行だけに制限しLIMIT 1ます。


25

@spacepilleによって提案された2つのクエリを組み合わせて、次のような単一のクエリにすることができます。

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

非常に高速に動作するはずですが、INNODBテーブルでは、ORDER + LIMITよりもミリ秒単位の速度が遅くなります。


@karthikeyanが4日前に彼の回答を書き、2015
。– vzr

いいえ、私は4日前に一部のスペルを編集および修正しました...投稿日は2014年のanswered Jun 14 at 9:41約1年6か月前の日付です:)
Dwza

ここの空気をきれいにするためだけにvzrは正しいです。「6月14日」は2016年6月14日を意味し、@ karthikeyanは現時点で2か月しかメンバーになりませんでした。
Robert Brisita

Ssooo ... @karthikeyanの答えはこれのコピーです!
クリフバートン

24

多くの行があるテーブルでは、2つのクエリがおそらくより高速です...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;


4

最近追加されたものが必要な場合は、タイムスタンプを追加し、最高のタイムスタンプで逆順に並べ替えを選択します。制限は1です。IDで移動する場合は、IDでソートします。追加したものを使用したい場合は、を使用してくださいmysql_insert_id


4

ほとんどすべてのデータベーステーブルには、auto_increment列があります(通常はid)

テーブルのすべての行の最後が必要な場合は、

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

または

次のような2つのクエリを1つのクエリに結合できます。

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

自動インクリメントは、DBA(またはテーブルを作成した人)が自動インクリメントを実装した場合にのみ存在します
WhatsThePoint

2
SELECT * FROM adds where id=(select max(id) from adds);

このクエリは、テーブルの最後のレコードをフェッチするために使用されました。


以下の回答のコピー
Jbur43、19年

2

ここでの多くの答えは同じです(自動インクリメントで並べ替え)。これは、インデックスに自動インクリメントされた列がある場合は問題ありません。

あなたは、このようなフィールドを持っており、それがあればサイドノートでは、ある主キー、使用のためのパフォーマンスの低下はありませんorder byselect max(id)。主キーは、データベースファイルでのデータの順序付け方法(少なくともInnoDBの場合)であり、RDBMSはそのデータの終わりを認識しており、最適化できます。order by id + limit 1到達するのと同じになるようにます。max(id)

現在、移動の少ない道は、自動インクリメントされた主キーがない場合です。多分主キーは3つのフィールドの複合である自然キーです...すべてが失われるわけではありません。プログラミング言語から、最初に行数を取得できます

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

そして、LIMIT節で取得した数値を使用します

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

残念ながら、MySQLでは、サブクエリ、またはLIMIT節内のユーザー変数は許可されません。


1

あなたは使用することができますOFFSETしてLIMITコマンドを実行します。

SELECT * FROM aTable LIMIT 1 OFFSET 99

テーブルに100行ある場合、これはprimary_keyに依存せずに最後の行を返します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.