如何在MySQL中获得行位置?

时间:2013-05-16 17:52:45

标签: mysql sql database

首先,我试图谷歌这个,但只提出了这样的答案: MySQL - Get row number on select

我需要的是“通过speciefic id获得行位置”。

通过上面链接的示例,我尝试添加“WHERE CLAUSE”,但是,“rank”的结果总是为1.

所以,如果我的表有自动增量id字段,并且不是特定顺序(例如,在id 1来3之后,而不是2,因为id 2已从数据库中删除),我怎样才能得到for的位置例如id 4?

有没有可能获得的方法,我想要的是什么?

6 个答案:

答案 0 :(得分:4)

对于基于1的位置:

SELECT COUNT(id) AS pos FROM table WHERE id <= current_id

对于从0开始,更改&lt; = for&lt;

答案 1 :(得分:3)

假设,按“位置”,您的意思是按id排序:

SELECT COUNT(*) FROM my_table WHERE id <= 4

答案 2 :(得分:1)

看看这些SQL Fiddle

CREATE TABLE league_girl (position int, username varchar(10), score int);
INSERT INTO league_girl VALUES (1, 'a', 10);
INSERT INTO league_girl VALUES (2, 'b', 25);
INSERT INTO league_girl VALUES (7, 'c', 75);
INSERT INTO league_girl VALUES (10, 'd', 25);
INSERT INTO league_girl VALUES (16, 'e', 55);
INSERT INTO league_girl VALUES (17, 'f', 80);
INSERT INTO league_girl VALUES (27, 'g', 15);

此查询为我record提供position = 17及其6th Row Number

Select * from (SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r) as k
WHERE   k.position = 17;

答案 3 :(得分:0)

如果你的意思是

,MySQL没有找到row number的任何功能

答案 4 :(得分:0)

我需要一些非常相似但更通用的东西。我有几个order子句的select查询,我需要在结果集中找到特定id的位置。想象一下过滤的产品列表和过滤器集,您需要的是找到产品所在的页面。

基于Henrique Barcelos解决方案:

原始查询:

SELECT * FROM mytable 
WHERE something = TRUE
ORDER BY 
    price ASC, 
    discount DESC, 
    catagory ASC

查找特定ID的行查询:

SELECT COUNT(id) FROM mytable
WHERE something = TRUE
AND (
    price < 'myprice'
    OR (price = myprice AND discount > 'mydiscount')
    OR (price = myprice AND discount = 'mydiscount' AND category < 'mycategory')
)

您必须获得获得第一个位置所需对象的mypricemydiscountmycategory

您可以使用小于(&lt;)升序,大于(&gt;)降序。

此查询可以通过算法轻松生成。

它比具有变量@curRow的解决方案更具资源效率,因为它不需要获取行并且只能从索引计算结果。

答案 5 :(得分:0)

SET @curRow = 0;
SELECT *, @curRow := @curRow + 1 row FROM `table`

如果要将实际订单存储为表中的值,可以添加新列,例如行,然后

set @curRow = 0;
update `table` set row = @curRow := @curRow + 1;

或者你可以更新主键如果你想清除间隙(如果它是保存以更改id,例如,如果它只是单独的测试表)