2010-09-15 3 views
0

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

Есть два типа сообщений:

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

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

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

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

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

+0

MySQL не имеет поддержки иерархического/рекурсивного запроса –

+0

, так как, например, как сайт, например reddit или youtube, будет отвечать на группировку ответов, должен быть способ сделать это с помощью mysql ... может быть, не так, как я предложил Я должен попробовать – Scarface

ответ

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 на том, как бы я сделал это с помощью этого запроса ? – Scarface

+0

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