Як би я зробив щось подібне?
SQL SELECT рядок ІЗ таблиці WHERE id = max (id)
Як би я зробив щось подібне?
SQL SELECT рядок ІЗ таблиці WHERE id = max (id)
Відповіді:
Ви можете використовувати підвідбір:
SELECT row
FROM table
WHERE id=(
SELECT max(id) FROM table
)
Зауважте, що якщо значення max(id)
не унікальне, повертається кілька рядків.
Якщо ви хочете лише один такий рядок, використовуйте відповідь @ MichaelMior,
SELECT row from table ORDER BY id DESC LIMIT 1
id
це лише стовпець у таблиці. Немає гарантії, що значення в id
стовпці повинні бути унікальними.
id
це не первинний або унікальний ключ :) Враховуючи назву, є розумний шанс, що це так. Варто також зазначити, що залежно від СУБД, яку ви використовуєте, підхід з підрядом може бути набагато менш ефективним.
id
може бути зовнішній ключ, і в цьому випадку він не може бути унікальним. Я зробив кілька бенчмаркінгу, використовуючи, set profiling = 1; ...; show profiles
і, здається, наші рішення мають однакову продуктивність за допомогою MySQL. Наскільки мені відомо, чи знаєте ви, що СУБД має нижчу продуктивність для підселектів?
Ви також можете зробити
SELECT row FROM table ORDER BY id DESC LIMIT 1;
Це буде сортувати рядки за їх ідентифікаційним кодом у порядку зменшення та повертати перший рядок. Це те саме, що повертати рядок з максимальним ідентифікатором. Звичайно, це передбачає, що id
це унікально серед усіх рядів. Інакше може бути кілька рядків із максимальним значенням, id
і ви отримаєте лише один.
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)
не буде працювати ?!
SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)
завдяки чому мені просто потрібна entry_time
остання запис у базі даних. Чи достатньо цього твердження чи воно повинно бути:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
Ви не можете дати, order by
тому що order by
робить "повне сканування" на столі.
Наступний запит краще:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BY
не виконає повного сканування, якщо ви вважаєте, що id
це основний ключ таблиці. (А якщо це не так, це досить погано названо.) Якщо це не так, як ви очікуєте MAX(id)
працювати без повного сканування таблиці? Якщо немає індексу, все значення необхідно все-таки перевірити, щоб знайти максимум.
Завжди можна використовувати аналітичні функції, які дадуть вам більше контролю
select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1
Якщо ви зіткнулися з проблемою з функцією rank () залежно від типу даних, ви також можете вибрати один з рядків_bumber () або щільний_rank ().
Спробуйте з цим
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table