Как я могу написать запрос ВЫБОРА с начальной строкой определенного ПК?

#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 бессмысленно, потому что вы заказываете by height . Вам нужно будет выполнить поиск на основе данной записи (возможно, проще всего путем самостоятельного присоединения к таблице), а затем использовать это, и в этом случае 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 можно использовать для определения начального ряда.

Большое спасибо Заводной Музе за то, что зажгла лампочку!