Bagaimana cara memilih catatan terakhir dari tabel dalam SQL?


133

Ini adalah kode sampel untuk memilih semua catatan dari tabel. Adakah yang bisa menunjukkan kepada saya bagaimana cara memilih catatan terakhir dari tabel itu?

select * from table

Ketika saya menggunakan: SELECT * FROM TABLE ORDER BY ID DESC LIMIT Saya mendapatkan kesalahan ini: Baris 1: Sintaks salah di dekat 'LIMIT'. Ini adalah kode yang saya gunakan:

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());
    }
}

Nah, Anda harus memesan sesuatu. Apakah Anda memiliki kunci utama? Mungkin ID?
alexn

Apa yang Anda maksud dengan "catatan terakhir"? Dengan nilai kolom kunci utama tertinggi?
Marcin Wroblewski

Jawaban:


337

Tanpa informasi lebih lanjut, Database dll yang terbaik yang bisa kita lakukan adalah sesuatu seperti

Sql Server

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
top 1 akan mengambil yang pertama, bukan?
Tassisto

30
Ya, tapi itu sebabnya Anda memesan oleh DESC
Adriaan Stander

3
Tetapi jika Anda menggunakan pesanan oleh DESC untuk sejuta catatan, itu akan memperlambat kueri Anda @AdriaanStander
Charles Hernandez

1
The mysql juga berfungsi dengan sql server. Ini adalah perintah sql generik.
azhar22k

1
@ itz-azhar: bentuk MySQL dari kueri ini bukan perintah SQL generik; yang LIMITkata kunci merupakan perpanjangan dari SQL yang hanya beberapa RDBMSes melaksanakan; terutama, Oracle tidak memiliki LIMITkata kunci
landru27

23

Dengan asumsi Anda memiliki kolom ID:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

Juga, ini akan bekerja pada SQL Server. Saya pikir MySQL yang mungkin perlu Anda gunakan:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

Tapi, saya tidak 100% yakin tentang ini.

EDIT

Melihat jawaban lain, saya sekarang 100% yakin bahwa saya benar dengan pernyataan MySQL: o)

EDIT

Baru saja melihat komentar terakhir Anda. Anda bisa melakukannya:

SELECT MAX(Id)
  FROM table

Ini akan memberi Anda nomor ID tertinggi.


2
SELECT MAX (id) DARI data Berfungsi sempurna!
Ricardo Fercher

15

untuk mendapatkan baris terakhir dari SQL-Database, gunakan string sql ini:

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

Keluaran:

Baris Terakhir db Anda!


3
Bekerja sangat baik dengan oracle juga dan lebih cepat daripada menyortir
MaKiPL

Yang ini adalah yang terbaik. Tanpa penyortiran, tidak ada "TOP 1", hanya permintaan yang didukung dan performan. Sempurna.
Matt F.

7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Ya ini mysql, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC

ini memberikan kesalahan! Saya pikir ini adalah SQL tetapi MySQL
Tassisto

1
Diedit ke SQL Server, namun Anda tidak menentukan DBMS Anda dalam pertanyaan.
Simon

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

Yang terakhir adalah yang pertama ketika Anda membalikkan pemesanan Anda.


1

Itu selalu merupakan praktik yang baik dalam desain tabel Anda untuk memiliki pengidentifikasi baris otomatis, seperti

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

, lalu Anda dapat mengidentifikasi baris terakhir dengan

 select * from yourTable where rowID =  @@IDENTITY 

Ini adalah trik keren, untuk catatan 2M + sangat cepat (setidaknya dalam kasus saya) Terima kasih
Jeancarlo Fontalvo

0

Di Oracle, Anda dapat melakukan:

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

Ini adalah salah satu cara yang mungkin.


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
Selamat datang di stackoverflow. Selain jawaban yang Anda berikan, silakan pertimbangkan untuk memberikan penjelasan singkat tentang mengapa dan bagaimana ini memperbaiki masalah.
jtate

0

Saya pikir ini harus dilakukan.

declare @x int;
select @x = max(id) from table_name;
select * from where id = @x;

0

Jika Anda memiliki bidang peningkatan diri (katakanlah ID) maka Anda dapat melakukan sesuatu seperti: 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);

Apakah Anda membaca pertanyaan dengan hati-hati? bagaimana INSERTnilai baru berhubungan dengan "bagaimana memilih catatan terakhir dari tabel itu"?
landru27

2
Selamat Datang di Stack Overflow! Terima kasih atas cuplikan kode, yang mungkin memberikan bantuan terbatas dan segera. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menjelaskan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan serupa lainnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
sepehr

Jangan menulis kode khusus php ketika OP telah bertanya tentang bahasa SQL saja.
steve moretz


-1

Saya membesarkan Ricardo. Sebenarnya max jauh lebih efisien daripada memilah. Lihat perbedaannya. ini sangat baik.

Saya harus mendapatkan catatan baris / pembaruan terakhir (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`
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.