Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Выборка записи с макисмальным ID.


Автор: Mal Hack 8.1.2005, 14:07
Вопрос такой. Есть таблица. 1 поле - ID - счетчик , второе - текст.
Надо выбрать 10 последних символов текстового поля в той записи у которой ID - максимален.
Сделал так:
Код

SELECT `id` , SUBSTRING( `message` FROM ( LENGTH( `message` ) -10 ) ) AS text
FROM `game` ORDER BY `id` DESC LIMIT 1

Но вот нельзя ли через MAX(`id`) сделать? Пробовал по разному писал либо "неизвестное поле в услдевии WHERE" или "Неправильное применение группопой функции".

Автор: Secandr 8.1.2005, 15:14
Это единственный вариант который я знаю.

только вот
Цитата
SUBSTRING( `message` FROM ( LENGTH( `message` ) -10 ) )
слишком не красиво!
Жаль тетрадки под рукой нет, вроде можно покороче записать.

Автор: Mal Hack 8.1.2005, 16:08
Secandr
Если будет возможность, подскажи, как покорооче.

Автор: Secandr 8.1.2005, 18:55
Так лень по манам лазитьsmile

Код
SELECT `id` , RIGHT(`message`,10) AS text FROM `game` ORDER BY `id` DESC LIMIT 1


Цитата
RIGHT(str,len)
Returns the rightmost len characters from the string str:
mysql> SELECT RIGHT('foobarbar', 4);
        -> 'rbar'

This function is multi-byte safe.

Автор: Mal Hack 8.1.2005, 19:11
Спасибо...
Вроде страницу со строковыми функциями два раза просмотрел... И главно RIGHT заметил, но не обратил внимание на смысл...
Спасибо. +1.

Автор: Kesh 9.1.2005, 01:21
Mal Hack Через MAX(`id`) сделать можно... но уж очень это некрасиво (читай "долго") будет... Т.к. для выбора максимального значения придется просмотреть весь объем выборки... С приемом ORDER BY такого не будет, т.к. будет браться максимальное значение ключа (который уже упорядочен, так уж они (ключи) устроены...) Это все, разумеется, если поле id - ключевое... Если же нет - то внутренняя сортировка и только потом выбор значения...

Ну и так... для примера... Думаю - должно сработать...
Код
SELECT `id` , RIGHT(`message`,10) AS text FROM `game` WHERE `id`=(SELECT MAX(`id`) FROM `game`)

По крайней мере на 4.1.7 сработало...

Автор: Mal Hack 9.1.2005, 01:34
Kesh
Вариант с подзапросом я не рассматривал вовсе... Уж слишком не экономно..

Автор: Kesh 9.1.2005, 01:36
А оно по другому не получается... Оно и в мануале так написано... Есть еще правда один способ с обработкой строковых значений... Но он уж и вовсе не красивее и не экономнее...

Автор: Secandr 9.1.2005, 10:42
Kesh Подзапросы только в 5ом mysql поддерживаются!

Автор: Kesh 9.1.2005, 12:19
Secandr Проверял на 4.1.7...

Автор: Secandr 9.1.2005, 13:19
Kesh надо проверить. У меня 4.0.22

Специально обновил список пакетов стабильных для дебиана. Последний стабильный Version: 4.0.22-2

так что пока я без вложеных запросов живу smile

Автор: Mal Hack 9.1.2005, 13:32
Secandr
http://dev.mysql.com/doc/mysql/ru/ANSI_diff_Sub-selects.html
С 4.1

Автор: Kesh 9.1.2005, 13:36
Цитата
3.5.2 Строка, содержащая максимальное значение некоторого столбца
"Как определить номер, дилера и цену самого дорогого изделия?"

В ANSI SQL это легко делается при помощи вложенного запроса:

Код

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop)


В MySQL (в котором вложенные операторы SELECT еще не реализованы) такая задача выполняется в два этапа:

Следует получить максимальное значение цены из таблицы при помощи оператора SELECT.
Используя это значение, необходимо составить следующий запрос:
Код

SELECT article, dealer, price
FROM   shop
WHERE  price=19.95


Существует еще одно решение: отсортировать все строки по убыванию цен и после этого получить первую строку, используя специальный оператор LIMIT:

Код

SELECT article, dealer, price
FROM   shop
ORDER BY price DESC
LIMIT 1


Примечание: если существует несколько самых дорогих изделий (например, каждое из них стоит 19,95), запрос, использующий LIMIT, возвращает лишь одно из них!


Добавлено @ 13:41
Или даже вот...
Цитата
3.5.2 Строка, содержащая максимальное значение некоторого столбца
"Как определить номер, дилера и цену самого дорогого изделия?"

В ANSI SQL (и MySQL 4.1) это легко делается при помощи вложенного запроса:

Код

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop)


В версиях MySQL до 4.1 такая задача выполняется в два этапа: ...

Добавлено @ 13:45
Mal Hack Точно... с 4.1 а то я систему обновил, а в мануал как-то не глянул.. будем теперь пользоваться... smile +1

Автор: Secandr 9.1.2005, 13:51
Жду выхода 4.1 под дебиан

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)