Как выбрать последнюю запись таблицы в 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 04

Что вы имеете в виду под «последней записью»? С наибольшим значением столбца первичного ключа?
Marcin Wroblewski

Ответы:


338

Без какой-либо дополнительной информации, какую базу данных и т. Д. Мы можем сделать лучше всего, например

SQL-сервер

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
топ-1 возьмет первый, не так ли?
Tassisto 04

30
Да, но именно поэтому вы заказываете по DESC
Адриан Стандер

3
Но если вы использовали заказ по DESC для миллиона записей, это замедлит ваш запрос @AdriaanStander
Чарльз Эрнандес

1
Mysql также работает с sql server. Это общая команда sql.
azhar22k

1
@ itz-azhar: форма MySQL этого запроса не является общей командой SQL; LIMITключевое слово является расширением SQL , что только некоторые RDBMSes реализации; примечательно, что у Oracle нет LIMITключевого слова
landru27

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

Это даст вам наивысший номер идентификатора.


2
ВЫБРАТЬ МАКС (id) ИЗ данных Работает отлично!
Ricardo Fercher

16

чтобы получить последнюю строку в виде SQL-базы данных использовать эту строку SQL:

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

Вывод:

Последняя строка вашего БД!


3
Также отлично работает с oracle и быстрее, чем сортировка
MaKiPL

Этот лучший. Никакой сортировки, никакого «ТОП 1», только поддерживаемые и эффективные запросы. Отлично.
Мэтт Ф.

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 04

1
Отредактировано для SQL Server, однако вы не указали свою СУБД в вопросе.
Саймон

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

Последнее будет только первым, когда вы измените порядок.


1

В дизайне таблицы всегда рекомендуется использовать автоматический идентификатор строки, например

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

, то вы можете определить свою последнюю строку по

 select * from yourTable where rowID =  @@IDENTITY 

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 08


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

2
Добро пожаловать в Stack Overflow! Спасибо за фрагмент кода, который может оказать некоторую немедленную помощь. Правильное объяснение значительно повысило бы его ценность в долгосрочной перспективе , объяснив, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими подобными вопросами. Отредактируйте свой ответ, чтобы добавить пояснения, включая сделанные вами предположения.
sepehr

Не пишите код, специфичный для php, когда OP спрашивает только о языке SQL.
Стив Морец


-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`
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.