2012-02-29 60 views
1

给定一个表的MySQL:查询返回的行偏移只有

field1 | field2 

abc  | 1 
efg  | 30 
etc  | 10 

我想运行像SELECT offset() FROM table WHERE field1 = 'etc' ORDER BY field2 DESC

查询这样的假想查询应该返回2(排序由field2 descfield1 = etc是第二排)

任何干净的方式来做到这一点?

感谢

+0

您是否想按某个度量标准对行进行排名,然后返回某些行的排名?准确地说是 – 2012-02-29 14:58:29

+0

。对不起,但我的英语是一个不好的野兽。 – cedivad 2012-02-29 14:59:26

+0

所以'SELECT offset()FROM table WHERE field1 ='abc'ORDER BY field2 DESC' should return 0 and field1 ='efg'should return 1? – 2012-02-29 15:00:26

回答

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 2012-02-29 15:09:18

+0

@triclosan,是的,它是有效的。 – 2012-02-29 15:22:13

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

为什么减1? – cedivad 2012-02-29 15:01:11

+1

因为这不是真正的查询。 – 2012-02-29 15:03:08

+0

我不这么认为。 ('newsgroup') - > where('freshness','>',$ newsgroup ['freshness']) - > DB :: select(DB :: expr('COUNT(newsgroup_id)AS rank')) - > > execute() - > get('rank') – cedivad 2012-02-29 15:06:34

1

怎么这样呢?

SELECT COUNT(*) FROM table outer 
WHERE field1 != 'etc' 
AND field2 <= (SELECT MAX(inner.field2) 
    FROM table inner 
    WHERE inner.field1 = outer.field1)