首先,我试过用谷歌搜索,但只得出了这样的答案: MySQL - Get row number on select
我需要的是“通过特定 id 获取行位置”。
通过上面链接的示例,我尝试添加“WHERE CLAUSE”,但是“rank”的结果始终为 1。
所以,如果我的表有自动递增 id 字段,并且没有按特定顺序(例如,在 id 1 之后是 3,而不是 2,因为 id 2 已从数据库中删除),我如何获得例如 id 4 的位置?
有什么办法可以得到,我想要什么?
首先,我试过用谷歌搜索,但只得出了这样的答案: MySQL - Get row number on select
我需要的是“通过特定 id 获取行位置”。
通过上面链接的示例,我尝试添加“WHERE CLAUSE”,但是“rank”的结果始终为 1。
所以,如果我的表有自动递增 id 字段,并且没有按特定顺序(例如,在 id 1 之后是 3,而不是 2,因为 id 2 已从数据库中删除),我如何获得例如 id 4 的位置?
有什么办法可以得到,我想要什么?
假设,通过“位置”,您的意思是按以下顺序排序id
:
SELECT COUNT(*) FROM my_table WHERE id <= 4
对于基于 1 的位置:
SELECT COUNT(id) AS pos FROM table WHERE id <= current_id
对于从 0 开始,将 <= 更改为 <
看看这些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
whereposition = 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;
我需要一些非常相似但更通用的东西。我有几个 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
,mydiscount
和mycategory
您需要获得第一个位置的对象。
您可以使用小于 (<) 用于升序,大于 (>) 用于降序。
这个查询可以很容易地通过算法生成。
它也比具有变量的解决方案更节省资源,@curRow
因为它不需要获取行并且可以仅从索引计算结果。
MySQL 没有任何功能来查找row number
您的意思
SET @curRow = 0;
SELECT *, @curRow := @curRow + 1 row FROM `table`
如果您想将实际订单作为值存储在表中,您可以添加新列,例如行,然后
set @curRow = 0;
update `table` set row = @curRow := @curRow + 1;
或者如果您想清除差距,您可以更新主键(如果保存以更改 ID,例如,如果它只是单独的测试表)