如何选择具有偏移量的特定行

时间:2019-02-09 11:32:14

标签: mysql database

所以我有这张桌子

id  |  gender  |  name
1   |  f       |  kate
2   |  m       |  john
3   |  f       |  monica
4   |  f       |  zoey
5   |  m       |  perry
6   |  f       |  mary
7   |  m       |  paul
8   |  f       |  carol
9   |  m       |  mark
10  |  m       |  ross
11  |  f       |  emily
12  |  m       |  Jay
13  |  m       |  Mike

如果我做了SELECT id name FROM users WHERE gender = m 我明白了:

id  |  gender  |  name
2   |  m       |  john
5   |  m       |  perry
7   |  m       |  paul  <<<
9   |  m       |  mark  <<<
10  |  m       |  ross  <<<
12  |  m       |  Jay
13  |  m       |  Mike

这就是我想要做的:

我要这样做是因为我有一个网站,并且希望在每个页面上显示3个结果(因此,最新的条目将首先显示)。因此,在第1页上,它应该显示

id  |  gender  |  name
13  |  m       |  Mike
12  |  m       |  Jay
10  |  m       |  ross

第2页:

id  |  gender  |  name
9   |  m       |  mark
7   |  m       |  paul  
5   |  m       |  perry

第3页:

id  |  gender  |  name
2   |  m       |  john

问题:我使用哪种select语句获得第3页中的类似结果

SELECT * FROM users
WHERE gender = 'm'
LIMIT 6, 3
ORDER BY DESC

我认为我是对的,但这是行不通的。对我而言,Limit 6意味着获得第六个结果(在本例中为John)。然后3从第6个结果中得到第7个和第8个结果。但是,我们没有第七,第八名。因此,我们只能得到第六个结果,也就是约翰。

1 个答案:

答案 0 :(得分:1)

OFFSET和LIMIT与ID不相关,而与row_number相关。这是小提琴供您理解。

CREATE TABLE t
    (`id` int, `gender` varchar(1), `name` varchar(6))
;
INSERT INTO t
    (`id`, `gender`, `name`)
VALUES
    (1, 'f', 'kate'),
    (2, 'm', 'john'),
    (3, 'f', 'monica'),
    (4, 'f', 'zoey'),
    (5, 'm', 'perry'),
    (6, 'f', 'mary'),
    (7, 'm', 'paul'),
    (8, 'f', 'carol'),
    (9, 'm', 'mark'),
    (10, 'm', 'ross'),
    (11, 'f', 'emily'),
    (12, 'm', 'Jay'),
    (13, 'm', 'Mike')
;
SELECT * FROM t
WHERE gender = 'm'
ORDER BY ID DESC
id | gender | name 
-: | :----- | :----
13 | m      | Mike 
12 | m      | Jay  
10 | m      | ross 
 9 | m      | mark 
 7 | m      | paul 
 5 | m      | perry
 2 | m      | john 
SELECT * FROM t
WHERE gender = 'm'
ORDER BY ID DESC
LIMIT 3 OFFSET 3 
id | gender | name 
-: | :----- | :----
 9 | m      | mark 
 7 | m      | paul 
 5 | m      | perry

db <>提琴here


用于选择第三页

SELECT * FROM t
WHERE gender = 'm'
ORDER BY ID DESC
LIMIT 3 OFFSET 6