Как получить ID строки с минимальным значением столбца при использовании GROUP BY?

Avenus

Under Glory Yield
Как получить ID строки с минимальным значением столбца при использовании GROUP BY?

Как известно при использовании GROUP BY в запросах ORDER BY
для группируемых значений не работает :-(

Т.е. если я выбираю:
PHP:
select U,F1 from T1 group by ID order by F1
То из множества строк для одинаковых ID будет выбираться F1 для первой записи:
U|ID|F1
1 |1 | 3 (первая добавленная запись)
2 |1 | 1
3 |1 | 2
Приведенный запрос выдаст: U=1, F1=3.

Можно было бы просто получить это значение по min(F1), но это при самой простой задаче.
А нужно, к примеру, еще и count полей сделать и получить при этом U с минимальным F1.
Тогда вообще ппц...

Я пытаюсь обойти это дело так:
PHP:
select min(T1.F1) as F1_min,count(T1.U) as nums,temp.U from T1
left join T1 as temp on temp.F1=F1_min group by T1.ID
Получаю ошибку:
#1054 - Unknown column 'F1_min' in 'on clause'

Кто подскажет, как обойти группировку в такой задаче?
 

zerkms

TDD infected
Команда форума
запрос задаётся раз в месяц и каждый раз я в него пишу эту фразу. ищи.
 

Avenus

Under Glory Yield
zerkms, я искал... подскажи, что искать...
если это было бы действительно так... мог бы написать
"ищи ..." (что искать) :)
нет же, ты написал такое длинное предложение!

-~{}~ 08.04.09 08:44:

zerkms, нашел кучу постов твоих в похожих темах с такой же фразой "ищи" и нигде ты совета не давал... :)
 

Avenus

Under Glory Yield
Что за бред...

-~{}~ 08.04.09 09:08:

Зачем-то временные таблицы, блин...
Вот мой реальный пример, а не тот, что ты дал по ссылке...

-~{}~ 08.04.09 09:14:

Выбираю пользователей, к ним присоединяю их фотографии, если имеются, конечно... к тому же главную из имеющихся:
T1 - пользователи
T2 - фотографии
К примеру, у пользователя с T1.ID=1 есть 3 фото, главное с T2.ID=2. Приоритет фото также в T2 по полю F... т.е. самое минимальное F - главное фото :)
PHP:
select T1.*,T2.* from T1 left join T2 on T2.ID=T1.ID group by T1.ID  order by T1.A
Важно сортировать в первую очередь по полю T1.A!
А вот из T2 я получу не главное фото, а то, что было первым добавлено :)

-~{}~ 08.04.09 09:17:

То, что я нашел тут в постах, добавить:
PHP:
select T1.*,T2.*,min(T2.F) MINF from T1 left join T2 on T2.ID=T1.ID group by T1.ID  order by T1.A,MINF
Не помогает...
 

zerkms

TDD infected
Команда форума
Avenus
читай внимательнее. там 9 рабочих решений проблемы. выбирай какое тебе больше нравится.
 

Avenus

Under Glory Yield
zerkms, почитаю... больше ничего не остается :)

-~{}~ 08.04.09 19:28:

zerkms, да... там есть рабочие решения проблемы.
Но только при обязательном присутствии значений полей, для которых проблема решается.

В моем же случае, фотографий может и не быть! Поэтому я не могу жестко в where прописать такое условие. Иначе получу пользователей только с фотографиями, понимаешь?

-~{}~ 08.04.09 19:45:

Вот пример
---
Таблица T1 - пользователи, возьму только поля:
ID - идентификатор пользователя (INT)
А - активность (INT) / в него пишу время time()

Таблица T2 - фотографии, поля:
ID - идентификатор фото (INT)
UID - принадлежность к пользователю (INT)
F - приоритет среди других его фото (TINYINT), чем меньше число, тем выше приоритет.

Есть записи в T1:
PHP:
select ID,A from T1 order by A desc
ID | A
1 | 1238791615
3 | 1238181355
2 | 1238101355

И есть записи в T2:
PHP:
select ID,UID,F from T2 order by UID
ID | UID | F
1 | 1 | 7
2 | 1 | 2
3 | 1 | 5
4 | 2 | 1
5 | 2 | 0
Отсортировано по UID и по добавлению записей в таблицу.

А теперь нужно выбрать пользователей с сортировкой по убыванию активности и присоединить главное фото. При этом подсчитать количество всех его фото.
PHP:
select T1.ID,T2.ID,COUNT(T2.ID) as N,T2.F from T1 left join T2 on T2.UID=T1.ID group by T1.ID order by T1.A desc
Я получу:
T1.ID | T2.ID | N | F
1 | 1 | 3 | 7
3 | 0 | 0 | 0
2 | 4 | 2 | 1

Здесь для строки с T2.ID не имеет наименьший приоритет поле F!

Подскажи, как в таком случае присоединить строки из T2 с наименьшим F?

-~{}~ 08.04.09 22:04:

Вот, написал... чтобы заработало, но ужас какой-то :(
PHP:
select
 T1.ID,
 T2.ID, T2.F,
 COUNT(T3.ID) as N
from T1
 left join T2 on T2.UID=T1.ID and T2.F=(select min(T2.F) from T2 where T2.UID=T1.ID)
 left join T2 as T3 on T3.UID=T1.ID
group by T1.ID
order by T1.A desc
 
Сверху