Как выбрать конкретные строки со смещением - PullRequest
0 голосов
/ 09 февраля 2019

Итак, у меня есть эта таблица

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

Вопрос: Какой оператор выбора я использую, чтобы получить результаты, как на странице 3 .

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

Я думаю, что я прав, но этоне работаетДля меня Limit 6 означает, получить 6-й результат (в данном случае это Джон).Тогда 3 означает из 6-го результата, получить 7-й и 8-й результат.Однако у нас нет 7-го, 8-го.Таким образом, мы должны получить только 6-й результат, он же Джон.

1 Ответ

0 голосов
/ 09 февраля 2019

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

дБ <> скрипка здесь


Для выбора Третьей страницы

SELECT * FROM t
WHERE gender = 'm'
ORDER BY ID DESC
LIMIT 3 OFFSET 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...