Mysql Группировка строк в запросе?

AnrDaemon

Продвинутый новичок
Что-то то ли я туплю, то ли что.
Есть таблица…
Код:
id, parent_id, left_id
1, 0, 1
2, 1, 4
3, 1, 18
4, 1, 42
5, 1, 50
6, 0, 65
7, 6, 66
8, 6, 72
9, 0, 85
10, 9, 86
11, 9, 100
12, 0, 111
Надо выбрать по одному id из каждого parent_id с маскимальным left_id.
Тривиально, казалось бы…
Код:
SELECT `id`, `parent_id`, MAX(`left_id`) FROM `table` GROUP BY `parent_id`
Результат - `id` абсолютно любой. Зачастую первый в каждом сабсете.
КАК этот запрос сделать правильно?
 

Adelf

Administrator
Команда форума
Ох не эксперт я в SQL но чот заинтересовался. Чую, люди разбирающиеся засмеют.
Код:
select t.* from `test` t, (select parent_id, max(left_id) as left_id from `test`
group by parent_id) p
where t.left_id = p.left_id and t.parent_id = p.parent_id
Дало мне нужный результат. Но работает только при уникальных парах left_id и parent_id. При неуникальных надо будет группировать.
 

AnrDaemon

Продвинутый новичок
Ну, мы в итоге как-то так и вывернулись.
SELECT ... FROM table1 t1 LEFT JOIN (SELECT parent_id, MAX(left_id) FROM table2 GROUP BY parent_id) t2 ON ...
В подзапросе создали референс и дальше всё стало мило и культурно.
 

WMix

герр M:)ller
Партнер клуба
@Adelf, есть такой трик, может приколит
Код:
select substring( max( concat( lpad( left_id, 8, '0'), id)),9) from table2 GROUP BY parent_id
на больших данных будет на много быстрее
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Нипанял… Что оно делает? :confused:
А, не… кажется, понял… Но хотелось бы всё таки без "вроде"…
 

WMix

герр M:)ller
Партнер клуба
сконкатили left_id и id, выбрали макс и вырезали left_id лучше. вместо 0 любую букву или пробел чтоб сравнивало как строки( я не учел что оба значения числовые)
 
Последнее редактирование:

Adelf

Administrator
Команда форума
Не люблю я такие трики. Я слишком стар для них :)
 

WMix

герр M:)ller
Партнер клуба
все вы так говорите, до тех пор пока 20 летнюю обнаженную афродиту не увидите ;)
 

AnrDaemon

Продвинутый новичок
сконкатили left_id и id, выбрали макс и вырезали left_id лучше. вместо 0 любую букву или пробел чтоб сравнивало как строки( я не учел что оба значения числовые)
Да, забавно. Конкатить наверное тоже лучше с пробелом. Чтобы с гарантией, так сказать.
 
Сверху