Как сделать LIMIT по нескольким группам?

Adelf

Administrator
Команда форума
Avenus
Кароч.. моя идея геморна в исполнении, но она позволит тебе делать быструю выборку по индексу.
Все твои запросы без предварительной подготовки будут с плохим explain, поверь.

prolis
Ага, не заметил :)
 

Avenus

Under Glory Yield
Я немного недописал запрос, из-за этого и ошибка.
Нужна еще проверка по дополнительному полю, которое определяет выбор. Т.е. не просто по 5 в каждой группе, а например, по 5 последних по дате из каждой группы:
PHP:
select t1.id, t1.g, t1.dated 
from tbl as t1 
where 5 >= (
 select count(*)+1 
 from tbl as t2 
 where t2.dated > t1.dated and t1.g = t2.g 
) 
order by t1.g, t1.dated desc
У меня сейчас этот запрос работает верно, т.е. именно так, как нужно.

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

-~{}~ 30.01.10 06:34:

Все твои запросы без предварительной подготовки будут с плохим explain
А что можешь посоветовать, в плане подготовки?

И, кстати, последний мой запрос: его ведь можно использовать не для выборки данных, а для занесения ключей?

Т.е. cron будет выполнять:
PHP:
update tbl set orderkey=0 where orderkey=1// обнуление ключей

select t1.id // выбор id для установки ключей
from tbl as t1
where 5 >= ( 
 select count(*)+1  
 from tbl as t2  
 where t2.dated > t1.dated and t1.g = t2.g  
)  
order by t1.g, t1.dated desc

update tbl set orderkey=1 where id in ($id) // установить ключи
А на сайте уже выбирать данные:
PHP:
select * from tbl where orderkey=1 order by t1.g, t1.dated desc
Добавить индекс на orderkey.

Или я не верно рассуждаю? :)
 

Adelf

Administrator
Команда форума
Avenus
ага. Вот только это урезанная вариация моего варианта :)
Лучше уж если индекс есть сразу по нему и сортировать. сделать его 1, 2, 3 и т.д.
В общем неинтересно мне уже обсуждать. Варианта два. твой - хитрым запросом, мой - с подготовкой и простейшим запросом. Сделай как проще тебе. Если вдруг что-то не будет устраивать - будем думать как исправить положение.
Это не та задача, с которой можно возиться так долго.
 

prolis

Новичок
Avenus
какую логику выполнения ты надеешься получить от:
[sql]
where 5 >= ( select count(*)+1 from tbl)
[/sql]?
 
Сверху