MySQL组按concat值并获得每个组内的第一个id(UUID)

时间:2016-12-03 17:08:05

标签: php mysql laravel-5

我已经挣扎了几个小时了。我正在编写消息传递系统,我的表格包含以下列:

ID(UUID)| from_user_id(uuid)| to_user_id(uuid)|主题|身体| created_at

在收件箱页面中,我需要按主题+ from_user_id分组结果。这是必需的,因为如果主题是相同的,那么它是一个单独的对话,并且from_user_id应该与主题连接,以确保如果其他用户将发送具有相同主题的消息,则不会与其他对话合并。

第二件事是,对于每个群组,我需要将第一条消息显示为对话封面消息。如果我使用了正常的ID,那么解决问题会很容易,但我使用的是UUID,因此我不能使用min或max。所以我需要使用created_at字段来确定哪一行是最后一行。

我尝试了很多不同的方法,但我无法得到我需要的结果。也许有人之前有过类似的问题并且有解决方案吗?

select msg.id, msg.body, msg.created_at, concat(msg.from_user_id, msg.subject) as concat

from messages as msg 

where msg.to_user_id = '8d99eb39-24f8-4dd6-b984-9505cd3eb6b6' 


order by msg.created_at desc limit 10 offset 0

1 个答案:

答案 0 :(得分:1)

基本上你需要子查询来识别每个线程中的最后一条消息, 然后选择该子查询以获取每个最后一个消息的详细信息

select * from messages 
 where to_user_id = 'jim'
   and concat(from_user_id, subject, created_at)  in (

    select max(concat(from_user_id, subject, created_at)) 
    from messages
    where to_user_id = 'jim' 
    group by concat(from_user_id, subject))