4

首先,我试过用谷歌搜索,但只得出了这样的答案: MySQL - Get row number on select

我需要的是“通过特定 id 获取行位置”。

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

所以,如果我的表有自动递增 id 字段,并且没有按特定顺序(例如,在 id 1 之后是 3,而不是 2,因为 id 2 已从数据库中删除),我如何获得例如 id 4 的位置?

有什么办法可以得到,我想要什么?

4

6 回答 6

5

假设,通过“位置”,您的意思是按以下顺序排序id

SELECT COUNT(*) FROM my_table WHERE id <= 4
于 2013-05-16T17:55:01.753 回答
5

对于基于 1 的位置:

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

对于从 0 开始,将 <= 更改为 <

于 2013-05-16T17:55:34.050 回答
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);

这个查询给了我recordwhereposition = 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;
于 2013-05-16T19:26:28.217 回答
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')
)

您必须获得myprice,mydiscountmycategory您需要获得第一个位置的对象。

您可以使用小于 (<) 用于升序,大于 (>) 用于降序。

这个查询可以很容易地通过算法生成。

它也比具有变量的解决方案更节省资源,@curRow因为它不需要获取行并且可以仅从索引计算结果。

于 2014-07-15T15:02:44.183 回答
0

MySQL 没有任何功能来查找row number您的意思

于 2013-05-16T17:59:58.413 回答
0
SET @curRow = 0;
SELECT *, @curRow := @curRow + 1 row FROM `table`

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

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

或者如果您想清除差距,您可以更新主键(如果保存以更改 ID,例如,如果它只是单独的测试表)

于 2016-11-05T20:06:18.000 回答