テーブルで最大のIDを持つ行全体を選択するにはどうすればよいですか?


回答:


228

あなたは副選択を使うことができます:

SELECT row 
FROM table 
WHERE id=(
    SELECT max(id) FROM table
    )

の値がmax(id)一意でない場合、複数の行が返されることに注意してください。

そのような行が1つだけ必要な場合は、@ MichaelMiorの回答を使用します。

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori:名前にもかかわらず、idテーブル内の単なる列です。id列の値が一意である必要があるという保証はありません。
unutbu 2013年

1
@unutbu idこれが主キーでも一意のキーでもないと仮定します:)名前を考えると、それが妥当な可能性があります。また、使用しているDBMSによっては、副選択を使用したアプローチでは効率が大幅に低下する可能性があることにも注意してください。
Michael Mior

3
@MichaelMior:id外部キーの可能性があります。その場合、一意ではない可能性があります。私はいくつかのベンチマークを使用set profiling = 1; ...; show profilesして実行しましたが、MySQLを使用しても私たちのソリューションは同じパフォーマンスを持っているようです。私自身の知識として、どのDBMSの副選択のパフォーマンスが悪いか知っていますか?
unutbu 2014

1
それは外部キーかもしれませんが、私が言ったように、私はそれがそうではないという名前に基づいて推測しているだけです。MySQLは、副選択のパフォーマンスが悪いことが歴史的に知られています。ただし、新しいバージョンでは大幅に改善されているため、使用しているバージョンによって異なります。しかし、考え直してみると、この特定のクエリは大丈夫かもしれません。プロファイリングを使用してクエリを数回実行しても、必ずしも相対的なパフォーマンスについて多くのことを言うとは限りません。
マイケル・マイア14

149

あなたもすることができます

SELECT row FROM table ORDER BY id DESC LIMIT 1;

これにより、IDで行が降順にソートされ、最初の行が返されます。これは、最大のIDを持つ行を返すのと同じです。もちろん、これはidすべての行で一意であることを前提としています。それ以外の場合、最大値を持つ複数の行が存在する可能性があり、id1つしか取得できません。


OPが要求することを具体的に行うには、これを行います。しかし、他の回答はSQL構造に関するより良い教育を提供します:)
MatBailie

@デムスどうやって?他の答えについての説明はありませんか?もちろん、私もその罪を犯しています:(
Michael Mior '30

他の質問は、ロジックをリファクタリングせずに構文を修正します。したがって、OPは特定のSQLを正しく記述する方法を学習します。
MatBailie 2011

フェアポイント:)他の答えは間違いなくまだ論理を修正していますが。
マイケル・ミオール

パフォーマンスはどうですか?この種のクエリは既に機能しているので、ここにたどり着きましたが、それが正しい方法かどうか疑問に思いました。ORDER BYはO(n * log n)操作ではありませんか?
2015年

27
SELECT * 
FROM table 
WHERE id = (SELECT MAX(id) FROM TABLE)

@ shA.t SELECT entry FROM table WHERE id = MAX(id)は動作しませんか?!
oldboy '21

@ shA.tまた、私が次のようなことをやろうとしていること:データベースの最新のエントリをSELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)必要とするだけですentry_time。その文は十分であるか、それは次のようになりますSELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
oldboy

クエリ結果の最新のエントリには信頼できる意味はありません。挿入時間などのフィールドが必要です。ところで、個別に質問してください。もっと注目されることを願っています-HTH;)。
shA.t 2018年

17

テーブルを「フルスキャン」するので与えorder byられorder byません。

次のクエリの方が優れています。

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

18
ORDER BYこれがidテーブルの主キーであると想定した場合、フルスキャンは実行されません。(そうでない場合は、名前が貧弱です。)そうでない場合MAX(id)、全表スキャンなしでどのように機能するでしょうか。インデックスがない場合でも、最大値を見つけるためにすべての値をチェックする必要があります。
Michael Mior

@CakeLikeBossよく私は実際に「order by」クエリと「SELECT * FROM table WHERE id =(SELECT MAX(id)FROM table);」を試しました 114行のテーブルに対するクエリで、このクエリは毎回正確に0.0004秒かかりましたが、2番目のクエリは0.0007秒から0.0010秒かかりました。これを数回繰り返しました
prabhjot

0

これでお試しください

 SELECT top 1  id, Col2,  row_number() over (order by id desc)  FROM Table

9
TOPキーワードはMySQLでは機能しません。このクエリは機能しません。
Anirudha Gupta

@toddmo:MySQL!また、Sql-Serverは他の人にとっても役に立ちません。あなたはMS-SQLを意味しますか?
レイザー

@raiserle、私がこの質問についてコメントしたり投稿したりした場所を見つけるのを手伝ってくれませんか?この質問に自分の名前が付いているのがどこにも見えません。
toddmo 2017

0

分析機能もいつでも利用でき、より多くの制御が可能になります

select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1

データのタイプに応じてrank()関数で問題が発生した場合は、row_number()または稠密ランク()から選択することもできます。

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