Как бы я сделал что-то подобное?
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