mysql :: выражение в limit / offset

Dovg

Продвинутый новичок
Добрый день, мне нужно сделать запрос, где limit определяется выражением. Mysql это позволяет?

пробовал вот так:
Код:
select hostname, server_name, script_name, req_time from request where script_name = 'viewBannerXml' order by req_time limit round((select count(*) from request where script_name = 'viewBannerXml') * 0.8), 1;
Само собой не работает.

Хотя синтаксический аналог в postgres чувствует себя хорошо:
Код:
plus1=> select created from plus1_user order by created limit 1 offset round((select count(*) from plus1_user) * 0.8);
       created       
---------------------
 2011-03-25 01:50:29
(1 row)
ps. Да, это pinba ;)
pps. offset можно вычислить заранее, но ведь состояние таблицы между вычислением offset и запросом может поменяться.

pps. Цель - получить время за которое успевает выполниться 80% запросов данного типа.
 

Dovg

Продвинутый новичок
Код:
mysql> select round(r.req_time, 3) as rt from request r where r.script_name = 'viewBannerXml' and (select count(*) from request rr where rr.req_time <= round(r.req_time, 3))/(select count(*) from request) >= 0.8 group by rt order by rt limit 1;
+-------+
| rt    |
+-------+
| 0.076 |
+-------+
1 row in set (10.60 sec)
Вот так сделал. Можно как-то проще? А то 10с - это не айс.
 

Dovg

Продвинутый новичок
>не проще сделать два запроса?
Между двумя запросами может измениться состояние таблиц.
 

newARTix

Новичок
А, не по глазам :) Учитывая round это не кажется критичным. Хотя вам виднее, конечно. Можно и блокировку использовать... всяко быстрее 10 сек должно быть.
 

fixxxer

К.О.
Партнер клуба
Вообще, offset 100500 это плохая идея. Лучше отталкиваться от id.

UPD. А, не заметил что pinba :)
 

fixxxer

К.О.
Партнер клуба
PHP:
CREATE TABLE `x` (
  `id` int(11) DEFAULT NULL,
  `t` int(11) DEFAULT NULL
)

select @i:=0; select (@lim:=(select count(*) from x)*.2), @i:=@i+1, if(@i<=@lim, @r:=t, null) from x order by t desc; select @r;
:D :D :D
 
Сверху