У меня есть веб-приложение, в котором я показываю серию сообщений на основе этой схемы таблиц (есть тысячи строк, подобных этому и другим столбцам тоже (удалены как не требуемые для этого вопроса)) : -Как это запросить в mysql
+---------+----------+----------+
| ID | COL1 | COL2 |
+---------+----------+----------+
| 1 | NULL | ---- |
| 2 | --- | NULL |
| 3 | NULL | ---- |
| 4 | --- | NULL |
| 5 | NULL | NULL |
| 6 | --- | NULL |
| 7 | NULL | ---- |
| 8 | --- | NULL |
+---------+----------+----------+
И я использую этот вопрос: -
SELECT * from `TABLE` WHERE `COL1` IS NOT NULL AND `COL2` IS NULL ORDER BY `COL1`;
И результирующий набор результатов я получаю, как: -
+---------+----------+----------+
| ID | COL1 | COL2 |
+---------+----------+----------+
| 12 | --- | NULL |
| 1 | --- | NULL |
| 6 | --- | NULL |
| 8 | --- | NULL |
| 11 | --- | NULL |
| 13 | --- | NULL |
| 5 | --- | NULL |
| 9 | --- | NULL |
| 17 | --- | NULL |
| 21 | --- | NULL |
| 23 | --- | NULL |
| 4 | --- | NULL |
| 32 | --- | NULL |
| 58 | --- | NULL |
| 61 | --- | NULL |
| 43 | --- | NULL |
+---------+----------+----------+
Обратите внимание, что столбец идентификаторов смешался в соответствии с предложением order by.
У меня есть соответствующие индексы для оптимизации этих запросов. Теперь позвольте мне объяснить настоящую проблему. В моем веб-приложении у меня есть ленивая функция. Итак, я показываю около 10 сообщений на странице, используя LIMIT 10
после запроса первой страницы.
Мы хорошо до сих пор. Но реальная проблема возникает, когда мне приходится загружать вторую страницу. Что я сейчас запрашиваю? Я не хочу, чтобы сообщения повторялись. И появляются новые сообщения, которые появляются почти каждые 15 секунд, что заставляет их идти сверху (сверху буквально означает первую строку) набора результатов (я не хочу отображать эти последние сообщения на второй или третьей странице, но они изменяют поэтому я не могу использовать LIMIT 10,10
для 2-й страницы и так далее, поскольку сообщения будут повторяться.).
Теперь, все, что я знаю, это последний идентификатор сообщения, которое я отобразил. Скажите 21
здесь. Итак, я хочу отображать сообщения ID 23,4,32,58,61,43
(см. Таблицу результатов выше). Теперь загрузите все строки без использования предложения LIMIT
и отобразите 10 идентификаторов, возникших после id 21
. Но для этого мне придется взаимодействовать с тысячами бесполезных строк. Но я не могу использовать предложение LIMIT
для 2-й, 3-й ... страниц, что точно. Кроме того, идентификаторы смешаны, поэтому я определенно не могу использовать WHERE ID>...
. Итак, куда мы теперь пойдем?
Поскольку ваш 'COL1' является сортируемым, как насчет того, чтобы запомнить последнюю запись' COL1' в каждом запросе, а на следующей странице загружать 'WHERE COL1>?'? – Passerby
@ Пассерби, я об этом уже подумал. Но у 'COL1' много одинаковых строк. На самом деле, 'COL1' является меткой времени, и многие строки могут иметь одну и ту же метку времени (в моем наборе результатов) – user4647309