оператор выбора для ленты сообщений

#mysql #select #feed

#mysql #выберите #поток

Вопрос:

У меня есть таблица «Сообщения» в базе данных MySQL. Она состоит из трех столбцов: msg_id, user_id, msg_content

Пользователи свободно добавляют / удаляют сообщения.

Я хочу отобразить ленту, которая:
1. отображает сообщения, упорядоченные по идентификатору.
2. отображать только 2 сообщения от одного и того же пользователя, если в таблице оказывается более 2 сообщений подряд от одного и того же пользователя.
3. отображать 10 сообщений одновременно

Например, если у нас есть:
msg_id 1, user_id A
msg_id 2, user_id A
msg_id 3, user_id A
msg_id 4, user_id B
msg_id 5, user_id C
msg_id 6, user_id B
msg_id 7, user_id B
msg_id 8, user_id B
msg_id 9, user_id A
msg_id 10, идентификатор пользователя F
msg_id 11, идентификатор пользователя D
msg_id 12, идентификатор пользователя E

Канал будет выглядеть примерно так:
msg_id 1, user_id A
msg_id 2, user_id A
msg_id 4, user_id B
msg_id 5, user_id C
msg_id 6, user_id B
msg_id 7, user_id B
msg_id 9, user_id A
msg_id 10, user_id F
msg_id 11, user_id D
msg_id 12, идентификатор пользователя E

каков наилучший способ реализовать инструкцию feed «Select» в mysql?

Спасибо

Ответ №1:

Если бы каждый пользователь отправлял 100 сообщений подряд, вам пришлось бы извлекать 500 строк… Хотя это возможно сделать в хранимой процедуре, это намного проще с дополнительным столбцом, скажем, «num», подсчитывающим сообщения подряд от одного и того же пользователя. При вставке сообщения с идентификатором пользователя проверьте идентификатор и номер последнего пользователя, который отправил сообщение с:

 SELECT user_id, num FROM messages ORDER BY msg_id DESC LIMIT 1
  

и вставьте num 1, если идентификатор пользователя нового сообщения совпадает с тем, который вы получили из запроса, или вставьте с num = 1, если нет.
Затем вы можете получить свою ленту с помощью простого запроса:

 SELECT * FROM messages WHERE num<=2 LIMIT 10