如何在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?
2011年

“最后记录”是什么意思?主键列的值最高?
Marcin Wroblewski

Answers:


337

没有更多的信息,我们能做的最好的数据库等等

SQL服务器

SELECT TOP 1 * FROM Table ORDER BY ID DESC

的MySQL

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
top 1会拿第一个,不是吗?
塔西斯托

30
是的,但是这就是为什么您通过DESC
Adriaan Stander

3
但是,如果您使用DESC的订单记录了一百万条记录,则会降低查询速度@AdriaanStander
Charles Hernandez

1
mysql也可以与sql server一起使用。这是一个通用的sql命令。
azhar22k

1
@ itz-azhar:此查询的MySQL形式不是通用的SQL命令;该LIMIT关键字是SQL的扩展,只有一些RDBMS中实现; 值得注意的是,Oracle没有LIMIT关键字
landru27 '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%。

编辑

查看其他答案,我现在100%确信我对MySQL语句是正确的:o)

编辑

刚刚看到了您的最新评论。您可以这样做:

SELECT MAX(Id)
  FROM table

这将为您提供最高的ID号。


2
从数据中选择MAX(id)完美!
里卡多·佛彻

15

要获取SQL数据库的最后一行,请使用以下sql字符串:

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

输出:

数据库的最后一行!


3
也可以与oracle一起正常使用,并且比排序更快
MaKiPL

这是最好的。没有排序,没有“ TOP 1”,只是受支持的高性能查询。完善。
Matt 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,2011年

1
编辑为SQL Server,但是您未在问题中指定DBMS。
西蒙(Simon)

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

当您取消订购时,最后一个只是第一个。


0

在Oracle中,您可以执行以下操作:

SELECT *
FROM (SELECT EMP.*,ROWNUM FROM EMP ORDER BY ROWNUM DESC)
WHERE ROWNUM=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“荷兰国际集团新的值涉及到‘如何选择表中的最后一条记录’?
landru27 '18

2
欢迎使用Stack Overflow!感谢您提供的代码段,它们可能会提供一些有限的即时帮助。通过描述为什么这是解决问题的一个很好的方法,适当的解释将大大提高其长期价值,并且对于将来有其他类似问题的读者来说,这将更为有用。请编辑您的答案以添加一些解释,包括您所做的假设。
sepehr

当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`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.