singlepost

как выбрать из базы строку,где id последнее? << На главную или назад  

Всем привет
помогите!
как выбрать из базы строку,где id последнее?
("SELECT * FROM gen_uptv WHERE id='???' ")
как правильно написать,если к примеру я не знаю,сколько там всего айди?))

22 ответов в теме “как выбрать из базы строку,где id последнее?”

  1. 21
    Александр Микинас ответил:

    Павел:
    Согласен, мальца тупанул. Но в любом случае равны будут только если оптимизатор в первом варианте не будет допускать сортировки всей таблицы(в MySql это так, в других базах неизвестно).

  2. 20
    Игорь Полищук ответил:

    Константин, no topic? =)
    Я бы на твоем месте создал новую тему с названием: "уровень изоляции транзакций" ибо это очень емкая тема для обсуждения!

    P.s. Наши карманы еще не настолько полны, чтобы пользовать Оракла! =)

  3. 19
    Владимир Муромский ответил:

    >> В Оракле есть специальная функция, которая возвращала последний id вставленной записии для текущего соединения

    Вот на это я и намекал, когда писал "надеюсь вам не нужно узнать id только что вставленной записи" :)

    >> Строчка с максимальным ИД не обязательно последняя, если ИД ставиться вручную.

    Да, никто не уточнил, в данном случае id – просто число или это AUTO_INCREMENT, как обычно делают. Я имел в виду второй вариант

  4. 18
    Павел Потапов ответил:

    В sql не особо силен… но по поводу сортировок могу сказать:

    1) Вычисление максимума выполняется за N шагов, т.к. в любос случае надо перебрать все элементы. За O(Log N) выполняется поиск известного значения в сортированном массиве.

    2) Для поиска первых k элементов не надо сортировать массив полностью ;) . А N Log N – это заведомо завышенная оценка. Сложность сортировки первых k элементов – O(N * Log K).

    В обсуждаемом случае оба варианта должны быть примерно равны по скорости.

  5. 17
    Константин Нагибович ответил:

    А если между вставкой и получением последнего id другой пользователь произведет свою вставку/удаление?
    В Оракле есть специальная функция, которая возвращала последний id вставленной записии для текущего соединения, тем самым ограждая от действий других пользователей.

  6. 16
    Александр Микинас ответил:

    Строчка с максимальным ИД не обязательно последняя, если ИД ставиться вручную.

    >>"Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу. " >>
    Т.е. разработчики MySQL предвидели запросы подобного вида и ввели условие в оптимизатор, что при наличие Limit, фактически выполняется не сортировка а поиск, в другой базе этого может не быть.

    Игорь, насчет эквивалентности по нагрузке вы отчасти не правы, для нахождения MAX достаточно LOG n шагов. (алгоритм поиска с делением пополам – классика), а для сортировки N x LOG N (быстрая сортировка или сортировка слиянием).

  7. 15
    Владимир Муромский ответил:

    >> Это как? Что значит "последняя строчка" в таблице?

    последняя добавленная строчка в таблице.У нее и будет максимальный id

    Цитата из документации MySQL:
    "Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу. "
    //php.su/mysql/manual/?page=LIMIT_optimisation

    P.S. не на почве 7 миллисекунд, а на почве 1,875-кратного прироста производительности) Нам же интересно выяснить, как оно там на самом деле происходит. Может в другой таблице миллисекунды у запросов поменяются местами

  8. 14
    Игорь Полищук ответил:

    Господа, главное не опускаться до скандалов на почве 7-ми миллисекунд! =)

    1) Владимир, движок действительно перебирает все значения в таблице, но не для того чтобы "конец стал началом", нет! Он просто сортирует все строки по колонке "id" ибо изначально они идут в порядке добавления!

    2) Роман, Александр, Андрей, Вы же не считаете, что оператор MAX, ничего не перебирая, сразу находит наибольшее значение? Этот оператор должен пробежаться по всем строчкам в столбце и посравнивать их! Я считаю, что 'ORDER BY' и 'MAX' вполне эквивалентны по нагрузке! а тот факт, что запроса как таковых в "#8" 2, подкидывает еще пару камней в довесок!

  9. 13
    Михаил Шаханов ответил:

    > взята просто одна последняя строчка, без всяких сортировок
    Это как? Что значит "последняя строчка" в таблице?
    И еще. Если вы так считаете, то зачем писать ордер бай?

  10. 12
    Андрей Денисов ответил:

    #8 самый адекватный

  11. 11
    Владимир Муромский ответил:

    Александр,
    Вы же не думаете, что в запросе

    SELECT * FROM gen_uptv
    ORDER BY id DESC
    LIMIT 0, 1;

    оптимизатор сперва выберет все значения из таблицы, потом отсортирует их и только после этого сделает LIMIT 0, 1?
    Я конечно точно не знаю, но мне всегда казалось, что тут оптимизатор поймет, что нужно выбрать одну строку, а параметр ORDER BY просто укажет, что выбирать нужно с конца, в итоге будет взята просто одна последняя строчка, без всяких сортировок

    upd: нашел на локалхосте какую-то таблицу и выполнил следующие запросы:

    SELECT *
    FROM `jos_modules`
    ORDER BY id DESC
    LIMIT 1
    // Показывает записи 0 – 0 (1 всего, Запрос занял 0.0008 сек)

    SELECT *
    FROM `jos_modules`
    WHERE id = (
    SELECT MAX( id )
    FROM jos_modules )
    // Показывает записи 0 – 0 (1 всего, Запрос занял 0.0015 сек)]

    Собственно, вот.

  12. 10
    Александр Микинас ответил:

    Есть подозрение что двойной запрос лучше, потому как отсутствует сортировка которая как известно по сложности n log n. Потому если оптимизатор не глуп, он сначало выполнит вложенный запрос за n шагов, а затем внешний за log n(поиск по индексу) и того = n+log n. Где n количество записей в таблице. Есть какое-то количество записей, после которого второй запрос становиться быстрее. Посколько записи в БД копяться лучше применять второй.

  13. 9
    Игорь Полищук ответил:

    Этот запрос сложнее… Двойной ибо.
    Но я готов выслушать аргументы – почему он лучше? =)

  14. 8
    Владимир Муромский ответил:

    А зачем писать два запроса, когда можно сделать одним? Разве это дает преимущество в производительности?

  15. 7
    Роман Стельмах ответил:

    лучше попробуй так
    SELECT * FROM gen_uptv WHERE id=(SELECT MAX(id) FROM gen_uptv )
    это называется подчиненные запросы)))

  16. 6
    Игорь Полищук ответил:

    Этот код можно использовать, например для отображения последнего зарегестрированного пользователя или сообщения… Или еще много чего…

  17. 5
    Владимир Муромский ответил:

    Надеюсь тебе не нужно было таким образом узнать id только что добавленной записи

  18. 4
    Игорь Полищук ответил:

    SELECT * FROM gen_uptv
    ORDER BY id DESC
    LIMIT 0, 1;

  19. 3
    Эдя Fruty ответил:

    спасибо))

  20. 2
    Эдя Fruty ответил:

    а можно кодом,а не словами?))

  21. 1
    Игорь Полищук ответил:

    отсортируй по спадающей и автоматически возьми первое значение…

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.