Выборка последних значений

Alex_Ar

Новичок
Выборка последних значений

Всем привет! Есть таблица в мускуле, в которой есть поля - дата и id пользователя. записис с одинаковыми id пользователя могут повторятся. Мне надо выбрать последнии записи(т.е. с самой старшей датой) на всех пользователей которые занесены в эту таблицу. Я пишу

select distinct idu from table where 1

соответсвенно выбирается только поле idu, а как мне выбрать остальные поля приэтом чтобы сортировка была по дате в порядке убывания?
 

baev

‹°°¬•
Команда форума
элементарно:
прочесть то, что русским языком написано по приведённым выше ссылкам.
 

Alex_Ar

Новичок
Послушай дружок.ты конечно можешь стебать эту тему дальше, но вот я например знаю как это сделать используя вложенный запрос, а одним запрос выполнить эту задачу нелегко. Так что если ты супер умный чел,а ты претендуешь на это звание, возьми да напиши ответ.
 

akd

dive now, work later
Команда форума
Alex_Ar, легко. достаточно пройти по ссылкам и почитать.
т.е. если ты не супер тупой, напряги свою голову, сходи и почитай.
 

Alex_Ar

Новичок
DESC не поможет, потому что
сортировка происходит после группирования...
А ваще я вот читаю идумаю, неужели не напрягает сидеть и выкрикивать - да я знаю, я могу... помоему легче написать ответ...
Но я вам больше скажу, что низрена у вас не получится :)
 

alexhemp

Новичок
Вы тут особо не прикалывайтесь. Это действительно непростая задача - вы подумайте сперва над условием.

Для тех кто в танке - рассказываю, есть таблица

ID (int), DT(datetime), другие поля

ID - неуникальные, уникальны пары ID, DT

Задача - выбрать все такие строки, в которых ID - уникален, а DT - максимальный для данной группы.

Запрос на группировку может провести групповые вычисления, но не поможет достать целые строки.

Alex_Ar
Я сделал с помощью подзапроса, увы по другому никак в один запрос похоже не сделать.
 

Alex_Ar

Новичок
alexhemp, спасибо что поддержал. Да я вот тоже бился бился и тоже только с помощью подзапроса решил задачу
 

baev

‹°°¬•
Команда форума
Ermitazh, по-моему, Вам ещё рано пытаться помогать другим.


alexhemp, Вам самому фраза «DT - максимальный для данной группы» ни о чём не говорит?

Ну, типа, что можно MAX(datetime), к примеру, использовать?

Или я чего-то не заметил?

-~{}~ 11.09.06 16:39:

P.S.
Код:
SELECT MAX( `crdate` ) , `crsum`
FROM `currates`
GROUP BY `cur`
— это у меня выборка из таблицы с курсами валют, где
cur — идентификатор валюты,
crdate — дата,
crsum — курс на дату.
 

bgm

 
baev
Процитирую alexhemp: Запрос на группировку может провести групповые вычисления, но не поможет достать целые строки.
 

Alex_Ar

Новичок
Автор оригинала: baev
Ermitazh, по-моему, Вам ещё рано пытаться помогать другим.


alexhemp, Вам самому фраза «DT - максимальный для данной группы» ни о чём не говорит?

Ну, типа, что можно MAX(datetime), к примеру, использовать?

Или я чего-то не заметил?

-~{}~ 11.09.06 16:39:

P.S.
Код:
SELECT MAX( `crdate` ) , `crsum`
FROM `currates`
GROUP BY `cur`
— это у меня выборка из таблицы с курсами валют, где
cur — идентификатор валюты,
crdate — дата,
crsum — курс на дату.
правильно все, только посмотри на первичные ключи в этой таблице, если они есть. Они не сохранили связи с данными и твоейпоследнейдате будет соответствовать совсем не ее ключ
 

alpine

Новичок
Решений у этой задачи несколько:
- Использовать CONCAT() + MAX()/MIN()
- Использовать подзапрос
- Использовать временную таблицу
все решения обсуждались в форуме и есть примеры запросов, в поиск ->

-~{}~ 11.09.06 17:02:

RTFM 3.6.4. The Rows Holding the Group-wise Maximum of a Certain Field
 

WMix

герр M:)ller
Партнер клуба
скажем есть поле дата и поле имена...
нужно выташить имя на махимальную дату..
как бы нибыло с групировкой или без делается это следуюшим образом

PHP:
SELECT SUBSTR( MAX(CONCAT(поле даты, поле имени) ), начало имени) FROM таблица LIMIT 1
-~{}~ 11.09.06 18:29:

те MAX(CONCAT(поле даты, поле имени) выташит по мах дате сложенное поле, substr обрежет дату и оставит имя
 

alexhemp

Новичок
В MSSQL такая проблема решается с использованием групповых ф-ций FIRST и LAST которые дают первую/последнюю строки в группе (в том порядке неявной сортировки при группировке).

Цитируя мануал:

“Can it be done with a single query?”
Yes, but only by using a quite inefficient trick called the “MAX-CONCAT trick”:
не слишком хороший прием.

-~{}~ 12.09.06 20:42:

Trianon

Запрос самообъединением - это интересный вариант... нужно подумать, уж слишком он простой, нет ли подводных камней.
 
Сверху