Как бы я сделал что-то подобное?
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это уникально среди всех строк. В противном случае может быть несколько строк с максимальным значением для, 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 () в зависимости от типа данных, можно также выбрать row_number () или density_rank ().
Попробуйте с этим
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table