#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