2012-02-29 3 views
1

Учитывая таблицуMySQL: запрос, возвращающий строки смещение только

field1 | field2 

abc  | 1 
efg  | 30 
etc  | 10 

Я хотел бы выполнить запрос как SELECT offset() FROM table WHERE field1 = 'etc' ORDER BY field2 DESC

Такой воображаемый запрос должен возвращать 2 (заказ по field2 desc, field1 = etc является второй ряд)

Любой чистый способ сделать это?

Благодаря

+0

Вы хотите ранжировать строки некоторой метрикой, а затем вернуть ранг некоторых строк? –

+0

точно. извините, но мой английский плохой зверь. – cedivad

+0

Итак, 'SELECT offset() FROM table WHERE field1 = 'abc' ORDER BY field2 DESC' должен возвращать 0, а field1 = 'efg' должен возвращать 1? –

ответ

1

Если вы имеете в виду ряд смещения, что: ранг строки после упорядочивания результатов с order by field2 DESC который имеет field1 = 'etc', тогда вы могли бы сделать что-то вроде:

SET @rowRank = 0; 
SELECT Sub.rowRank 
FROM 
(
    SELECT *, (@rowRank := @rowRank + 1) as rowRank 
    FROM TableName 
    ORDER BY field2 DESC 
) AS Sub 
WHERE Sub.field1 = 'etc' 

Это должно вернуться 2.

+0

такое выражение 'select *, any' valid? – triclosan

+0

@triclosan, Да, это действительно. –

0
select count(*) 
from table 
where field2 > {field2 of the row to search the offset for, in this case, 10}; 
+0

почему минус 1? – cedivad

+1

Потому что это не настоящий запрос. –

+0

Я так не думаю. DB :: select (DB :: expr ('COUNT (newsgroup_id) AS rank')) -> from ('newsgroup') -> где ('freshness', '>', $ newsgroup ['freshness']) - > execute() -> get ('rank') – cedivad

1

Как о чем-то вроде этого?

SELECT COUNT(*) FROM table outer 
WHERE field1 != 'etc' 
AND field2 <= (SELECT MAX(inner.field2) 
    FROM table inner 
    WHERE inner.field1 = outer.field1) 
Смежные вопросы