Як вибрати останній запис таблиці в 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());
    }
}

Ну, треба щось замовити. У вас є первинний ключ? Можливо, посвідчення особи?
alexn

Що ви маєте на увазі під "останнім записом"? З найвищим значенням стовпця первинного ключа?
Marcin Wroblewski

Відповіді:


337

Без будь-якої додаткової інформації, яка база даних тощо найкраще ми можемо зробити щось подібне

Сервер Sql

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
перший 1 візьме перший, чи не так?
Тассісто

30
Так, але саме тому ви замовляєте DESC
Adriaan Stander

3
Але якщо ви використовували замовлення DESC для мільйона записів, це сповільнить ваш запит @AdriaanStander
Чарльз Ернандес

1
Myql також працює з sql сервером. Це загальна команда 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%.

EDIT

Дивлячись на інші відповіді, я зараз на 100% впевнений, що я правильно з твердженням MySQL: o)

EDIT

Щойно побачив ваш останній коментар. Ви можете зробити:

SELECT MAX(Id)
  FROM table

Це отримає найвищий ідентифікаційний номер.


2
ВИБІР МАКС (id) З даних Працює ідеально!
Рікардо Ферчер

15

щоб отримати останню рядок у вигляді SQL-бази даних використовувати цей рядок SQL:

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

Вихід:

Останній рядок вашого db!


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

1
Відредаговано на SQL Server, однак ви не вказали свої СУБД у питанні.
Simon 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

2
Ласкаво просимо до переповнення стека! Дякуємо за фрагмент коду, який може надати деяку обмежену, негайну допомогу. Правильне пояснення значно покращило б його довгострокове значення , описавши, чому це хороше рішення проблеми, та зробило б кориснішим майбутнім читачам інші подібні запитання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
вересень

Не пишіть специфічний код для php, коли OP запитав лише про мову SQL.
steve moretz


-1

Я підтримав Рікардо. Насправді макс набагато ефективніше, ніж сортування. Дивіться відмінності. її відмінна.

Мені довелося отримати останній рядок / запис оновлення (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.