Извлечение данных в виде фрагментов строк из часто обновляемой таблицы MySQL - PullRequest
0 голосов
/ 21 ноября 2018

Моя таблица имеет вид ниже

|ID |ВРЕМЯ |ПОЛЬЗОВАТЕЛЬ |ДАННЫЕ |

|1 |1542785267683 |A |привет |

|2 |1542785385809 |Б |привет |

|3 |1542785385809 |C |эй |

|4 |1542785385809 |D |hii |

|5 |1542785385809 |E |hola |

|6 |1542795485058 |F |hiiiii |

Таблица будет в том же виде, что и выше, с тысячами строк.Я хочу получить последние 3 строки, а затем следующие 3 строки из таблицы, чтобы отобразить строки для пользователя, так же, как вы просматриваете сообщения, когда проводите вверх в приложениях для обмена сообщениями.

Я пробовал следующие методы:

  1. Извлечение по времени последнего сообщения первого выбранного чанка.Но это невозможно, поскольку две или более строки могут быть в одно и то же время, и это приведет к отображению одной и той же строки дважды.

SELECT * FROM MessageM WHERE TIME_RECEIVED

SELECT * FROM MessageM, ГДЕ TIME_RECEIVED <1542785385809 ЗАКАЗАТЬ ПО ВРЕМЕНИ_RECEIVED DESC LIMIT 3;# Оставляет две строки </p>

SELECT * FROM MessageM WHERE TIME_RECEIVED <= 1542785385809 ORDER BY TIME_RECEIVED DESC LIMIT 3;# дублирует два ряда </p>

Я прочитал ответ, упомянутый ниже

MySQL: получить большой выбор по фрагментам

Мои требования почти такие же, кроме таблицы, которую можно обновитьв промежутке времени, когда были получены фрагменты.

Так При использовании следующих запросов

SELECT * ОТ сообщения ORDER BY TIME DESC LIMIT 0, 2;

SELECT* ОТ сообщения ЗАКАЗ ПО ВРЕМЕНИ DESC LIMIT 2, 4;

Если между последовательными выборами будет вставлена ​​новая строка, та же строка, уже отображаемая, снова будет получена для следующего оператора выбора.Блокировка вообще невозможна.

Может решить проблему с помощью автоинкрементного столбца или Любые другие методы, такие как добавление нового столбца с некоторым другим ограничением, решат проблему или какую-либо форму раздела.

Я планировал использовать следующий запрос

ВЫБРАТЬ * ОТ сообщения ГДЕ ВРЕМЯ <= 1542785385809 И ID НЕ ВХОДИТ (5, 4) ЗАКАЗАТЬ ПО ВРЕМЕНИ DESC LIMIT 3; </p>

Получить время последней строки и получить идентификаторы всех строк с заданным временем из найденных строк.При запросе во второй раз введите идентификаторы в состоянии NOT IN.

Есть ли другой лучший способ сделать это.Может ли автоинкрементный столбец решить проблему или любые другие методы, такие как добавление нового столбца с некоторым другим ограничением или какой-либо формой раздела.

1 Ответ

0 голосов
/ 21 ноября 2018

Во-первых, не используйте столбец времени для сортировки - используйте вместо него ID.Я предполагаю, что ваш столбец ID представляет собой целое число с автоматическим приращением, поэтому он уникален и отсортирован по времени вставки.

Во-вторых, давайте рассмотрим подход, используемый социальными сетями (например, LinkedIn): вы загружаетеподача (последние N строк).При прокрутке вниз страницы загружаются следующие строки (еще N строк).Когда новые сообщения становятся доступными, вы нажимаете кнопку «Новые сообщения», которая полностью сбрасывает текущий вид и переходит в начало.Это возвращает вас к шагу 1, эффективно загружая последние N строк.

Технически это делается следующим образом:

SELECT * FROM MessageM ORDER BY ID DESC LIMIT 3;

Возврат:

|6 |1542795485058 |F |hiiiii |

|5 |1542785385809 |E |hola |

|4 |1542785385809 |D |hii |

Вы помните ID=4 как последний увиденный пост.Для следующей страницы вы загружаете:

SELECT * FROM MessageM WHERE ID < 4 ORDER BY ID DESC LIMIT 3;

Возвращается:

|3 |1542785385809 |C |эй |

|2 |1542785385809 |Б |привет |

|1 |1542785267683 |A |hi |

Вы помните ID=1 как последний увиденный пост.Для следующей страницы вы загружаете:

SELECT * FROM MessageM WHERE ID < 1 ORDER BY ID DESC LIMIT 3;

Не возвращая строк.Это означает, что вы не можете загружать старые сообщения.

Чтобы сбросить все, просто перейдите к шагу 1:

SELECT * FROM MessageM ORDER BY ID DESC LIMIT 3;

Возврат:

|7 |1542785385809 |A |какой-то новый пост |

|6 |1542795485058 |F |hiiiii |

|5 |1542785385809 |E |hola |

Итак, вы прочитали новое сообщение и теперь у вас есть еще несколько страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...