#mysql #sql #select #pagination #paging
#mysql #sql #выберите #разбивка на страницы #подкачка
Вопрос:
Я использую MySQL, который поддерживает смещение и ОГРАНИЧЕНИЕ, это здорово. Но что, если я хочу запрос с первой строкой, равной определенному первичному ключу, вместо индекса страницы?
например, у меня есть таблица:
ID NAME HEIGHT
1 kevin 1.67
2 bob 1.82
3 jane 1.70
4 wayne 1.59
Я хочу, чтобы список людей упорядочивался по их высоте ASC с последним идентификатором первой страницы равен 1, весь вид равен 4 1 3 2 (размер страницы = 2)
Что-то должно понравиться:
SELECT ID,NAME,HEIGHT FROM table OFFSET ???? LIMIT 2 ORDER BY HEIGHT ASC
Итак, я должен получить:
3 jane 1.70
2 bob 1.82
Комментарии:
1.Довольно уверен
ORDER BY
, что он должен быть доOFFSET
иLIMIT
. В любом случае ваше смещение — это просто номер страницы, умноженный на размер страницы (-1 для учета смещения на основе нуля)2. Вы не должны использовать
id
его ни для чего, кроме как для получения определенной строки (или для обеспечения стабильности порядка сортировки из-за того, что это уникальный ключ). Эти ценности неважны и редко релевантны. Если вы пытаетесь понизить критерии (так что теоретически вам это не нужноOFFSET
), вашеWHERE
предложение должно выглядеть примерно такWHERE height > :previousHeight OR (height = :previousHeight AND id > :previousId)
(предполагается, чтоid
это было добавлено вORDER BY
, чтобы сделать порядок одинаковыхheight
значений стабильным, на самом деле нам все равно, каково его значение).3. @Clockwork-Muse спасибо за совет, моя проблема в том, что мой клиент просто запрашивает действие «загрузить больше» и выдает мне последний идентификатор внизу списка, это очень похоже на загрузку комментариев на Youtube, каждый раз, когда я получаю идентификатор последнего комментария, как я могу это реализовать?
4. Проблема в том, что это
id
бессмысленно, потому что вы заказываете byheight
. Вам нужно будет выполнить поиск на основе данной записи (возможно, проще всего путем самостоятельного присоединения к таблице), а затем использовать это, и в этом случаеOFFSET
должно быть0
. Вы уверены, что он не передает вам индекс? Youtube (и подобные) могут сойти с рук простымid
, потому что значение, скорее всего, будет сгенерировано в обычном порядке сортировки при создании комментария. Здесь это не относится к вам.
Ответ №1:
Попробуйте это
Логические :
page_size page_number OFFSET
2 1 (2*1)-1 = 1
2 2 (2*2)-1 = 3
2 3 (2*3)-1 = 5
Запрос :
SELECT ID,NAME,HEIGHT
FROM table
ORDER BY HEIGHT ASC, ID ASC
LIMIT 2 OFFSET (page_size * page_number)-1
Комментарии:
1. Вам нужно добавить уникальный столбец в
ORDER BY
, чтобы обеспечить стабильный порядок сортировки (уникальные ключи хороши для этого, и один из немногих случаев, когда они входят в это предложение).2. Логика прямо здесь, что, если у меня нет
page_number
доступного?3. Вы должны изучить разбивку на страницы в PHP проверить ссылку phpeasycode.com/showdemo.php?target=/pagination/demo.php
Ответ №2:
Только что нашел решение. Запрос должен включать и id
то, и другое, и коэффициент сортировки (в моем случае это так height
). так что запрос будет выглядеть следующим образом:
SELECT * FROM table WHERE (t.height = last_height AND t.id > last_id) OR t.height > last_height ORDER BY t.height ASC, t.id ASC LIMIT 2
В случае, если есть несколько человек с одинаковым ростом, id
можно использовать для определения начального ряда.
Большое спасибо Заводной Музе за то, что зажгла лампочку!