MySQL групповой вопрос

0

Эй, ребята, быстрый вопрос. У меня есть таблица сообщений.

Существует два типа сообщений:

  • Сообщения с уникальным идентификатором группы
  • автономные сообщения

Сообщения с тем же идентификатором группы, что и по крайней мере одно другое сообщение - это я хочу объединить вместе, когда они будут представлены. Сгруппированные сообщения - это сообщения с ответами на них. То, что я хочу сделать, - это создать запрос для объединения сгруппированных сообщений в том месте, где раннее/корневое сообщение этой группы будет хронологически относиться к остальным сообщениям независимо от времени, когда будут введены ответы.

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

  SELECT timestamp, 
         user, 
         message, 
         group_id 
    FROM messages 
   WHERE topic_id = ? 
ORDER BY timestamp DESC 
   LIMIT 10

Есть ли у кого-нибудь предложения?

  • 0
    MySQL не имеет поддержки иерархических / рекурсивных запросов
  • 0
    Так как бы сайт, например, reddit или youtube делал группировку ответов, должен быть способ сделать это с помощью mysql ... может быть, не совсем так, как я предлагал попробовать
Теги:
group-by

1 ответ

2
Лучший ответ

Как насчет этого?

SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp
  FROM messages AS m JOIN
       (SELECT group_id, MIN(timestamp) AS grp_timestamp
          FROM messages
         GROUP BY group_id) AS g ON m.group_id = g.group_id
 WHERE m.topic_id = ?
 ORDER BY g.grp_timestamp, g.group_id, m.timestamp;

Логика состоит в том, чтобы идентифицировать самую раннюю временную метку для каждой group_id в подзапросе (предполагаемые сообщения без ответов имеют действительный присвоенный group_id), а затем сортировать сначала по метке времени группы, затем по идентификатору группы (так что если две группы в конечном итоге с той же временной меткой, сообщения все еще отсортированы правильно), а затем по метке времени сообщения.

Вы также можете нажать предложение WHERE в подвыборку.


Если вы хотите сначала получать самые последние сообщения, то в основном вы применяете DESC к предложению ORDER BY в соответствующих местах.

SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp
  FROM messages AS m JOIN
       (SELECT group_id, MIN(timestamp) AS grp_timestamp
          FROM messages
         GROUP BY group_id) AS g ON m.group_id = g.group_id
 WHERE m.topic_id = ?
 ORDER BY g.grp_timestamp DESC, g.group_id, m.timestamp DESC;

Возможно, вам захочется, чтобы группа с последним ответом появлялась первым; в этом случае вам нужно настроить агрегат от MIN до MAX:

SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp
  FROM messages AS m JOIN
       (SELECT group_id, MAX(timestamp) AS grp_timestamp
          FROM messages
         GROUP BY group_id) AS g ON m.group_id = g.group_id
 WHERE m.topic_id = ?
 ORDER BY g.grp_timestamp DESC, g.group_id, m.timestamp;

Пока вы в порядке с ответами, появляющимися в хронологическом порядке, я думаю, что это трюк. Если ответы должны отображаться в обратном хронологическом порядке с исходным сообщением, появляющимся первым, у вас есть некоторые трудности. Если вы отметили сообщения "L" для "leader" и "F" для "follower" в таблице сообщений, вы можете использовать этот столбец для сортировки. Если вам нужно динамически определять, является ли сообщение лидером или последователем, вам нужно работать усерднее.

  • 0
    Прежде всего, большое спасибо за ваше время, Джонатан. похоже, это работает, так как группа сгруппирована, а сама группа находится в правильном хронологическом порядке, но я хотел бы изменить порядок результатов в группе, используя desc или asc для, как бы я сделал это с этим запросом ?
  • 0
    Довольно эпический ответ Джонатана. Я очень ценю ваши усилия и время, которые помогли мне решить эту проблему и сделали все возможное, чтобы объяснить возможности ее решения. Еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню