SQLでテーブルの最後のレコードを選択する方法は?


133

これは、テーブルからすべてのレコードを選択するためのサンプルコードです。誰かがそのテーブルの最後のレコードを選択する方法を教えてもらえますか?

select * from table

使用時:SELECT * FROM TABLE ORDER BY ID DESC LIMIT 次のエラーが表示されます:1行目:「LIMIT」付近の構文が正しくありません。これは私が使用するコードです:

private void LastRecord()
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HELPDESK_OUTLOOKConnectionString3"].ToString());

    conn.Open();
    SqlDataReader myReader = null;
    SqlCommand myCommand = new SqlCommand("SELECT * FROM HD_AANVRAGEN ORDER BY " +
                "aanvraag_id DESC LIMIT 1", conn);
    myReader = myCommand.ExecuteReader();
    while (myReader.Read())
    {
        TextBox1.Text = (myReader["aanvraag_id"].ToString());
        TextBox1.Text += (myReader["wijziging_nummer"].ToString());
        TextBox1.Text += (myReader["melding_id"].ToString());
        TextBox1.Text += (myReader["aanvraag_titel"].ToString());
        TextBox1.Text += (myReader["aanvraag_omschrijving"].ToString());
        TextBox1.Text += (myReader["doorlooptijd_id"].ToString());
        TextBox1.Text += (myReader["rapporteren"].ToString());
        TextBox1.Text += (myReader["werknemer_id"].ToString());
        TextBox1.Text += (myReader["outlook_id"].ToString());
    }
}

さて、あなたは何かを注文する必要があります。主キーはありますか?おそらくID?
alexn 2011年

「最後の記録」とはどういう意味ですか?主キー列の値が最も高いですか?
Marcin Wroblewski、2011年

回答:


337

追加の情報がなければ、どのデータベースなどで私たちにできる最善のことは次のようなものです

SQLサーバー

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
トップ1が最初のものをとりますか?
Tassisto

30
はい、しかしそれがDESCで
Adriaan Stander

3
しかし、DESCによる注文を100万件のレコードに使用した場合、クエリが遅くなります@AdriaanStander
Charles Hernandez

1
mysqlはsqlサーバーでも動作します。これは一般的なsqlコマンドです。
azhar22k 2017年

1
@ itz-azhar:このクエリのMySQL形式は、一般的なSQLコマンドではありませんLIMITキーワードは、いくつかのRDBMSを実装するSQLを拡張したものです。特に、OracleにはLIMITキーワードがありません
landru27 '11 / 11/18

23

Id列があると仮定します。

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

また、これはSQL Serverでも機能します。私はあなたが使用する必要があるかもしれないMySQLだと思います:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

しかし、私はこれについて100%確信が持てません。

編集

他の回答を見ると、MySQLステートメントが正しいことを100%確信しています。

編集

ちょうどあなたの最新のコメントを見ました。あなたがすることができます:

SELECT MAX(Id)
  FROM table

これにより、最大のID番号が取得されます。


2
SELECT MAX(id)FROM data完璧に動作します!
Ricardo Fercher

15

SQLデータベースの最後のを取得するには、次のSQL文字列を使用します。

SELECT * FROM TableName WHERE id=(SELECT max(id) FROM TableName);

出力:

あなたのdbの最後の行!


3
オラクルでも完全に問題なく動作し、ソートよりも高速です
MaKiPL

これは最高です。並べ替えなし、「TOP 1」なし、サポートされているパフォーマンスの高いクエリのみ。完璧です。
マットF.

7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

はい、これはmysql、SQL Serverです。

SELECT TOP 1 * FROM Table ORDER BY ID DESC

これはエラーになります!これはSQLだと思ったがMySQLだ
Tassisto

1
SQL Serverに編集されましたが、質問でDBMSを指定していません。
Simon

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1


0

Oracleでは、次のことができます。

SELECT *
FROM (SELECT EMP.*,ROWNUM FROM EMP ORDER BY ROWNUM DESC)
WHERE ROWNUM=1;

これは可能な方法の1つです。


0
select ADU.itemid, ADU.startdate, internalcostprice 
from ADUITEMINTERNALCOSTPRICE ADU

right join

   (select max(STARTDATE) as Max_date, itemid 
   from ADUITEMINTERNALCOSTPRICE
   group by itemid) as A

on A.ITEMID = ADU.ITEMID
and startdate= Max_date

1
Stackoverflowへようこそ。あなたが提供した答えに加えて、これが問題を修正する理由と方法の簡単な説明を提供することを検討してください。
jtate

0

テーブル設計では、常に次のような自動行識別子を付けることをお勧めします。

 [RowID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL

、それからあなたはあなたの最後の行を

 select * from yourTable where rowID =  @@IDENTITY 


0

自己増分フィールド(たとえばID)がある場合は、次のようなことができます。 SELECT * FROM foo WHERE ID = (SELECT max(ID) FROM foo)


-1
$sql="SELECT tot_visit FROM visitors WHERE date = DATE(NOW()) - 1 into @s                
$conn->query($sql);
$sql = "INSERT INTO visitors (nbvisit_day,date,tot_visit) VALUES (1,CURRENT_DATE,@s+1)";
$conn->query($sql);

質問を注意深く読みましたか?どのようにINSERT「新たな価値をINGの『そのテーブルの最後のレコードを選択する方法』に関連?
landru27、

2
Stack Overflowへようこそ!コードスニペットをご利用いただきありがとうございます。このコードスニペットは、限られた範囲内ですぐに役立つ可能性があります。適切な説明は、これが問題の優れた解決策である理由を説明することにより、長期的な価値を大幅に改善し、他の同様の質問を持つ将来の読者にとってより有用になります。答えを編集して、仮定を含めて説明を追加してください。
sepehr 2018年

OPがSQL言語のみについて質問した場合は、php固有のコードを記述しないでください。
スティーブモレッツ


-1

私はリカルドに賛成した。実際、maxはソートよりもはるかに効率的です。違いをご覧ください。その優れた。

最後の行/更新レコード(timeStamp)を取得する必要がありました

`sqlite> select timeStamp from mypadatav2 order by timeStamp desc limit 1;
 2020-03-11 23:55:00
 Run Time: real 1.806 user 1.689242 sys 0.117062`

`sqlite> select max(timeStamp) from mypadatav2;
 2020-03-11 23:55:00
 Run Time: real 0.553 user 0.412618 sys 0.134340`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.