2016-12-03 143 views
0

我已经在这个问题上挣扎了好几个小时了。我正在编写邮件系统,我的表格有以下列:MySQL组通过concat值得到每个组中的第一个id(UUID)

ID(UUID)| from_user_id(uuid)| to_user_id(uuid)|主题| body | created_at

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

第二件事是,我需要获得第一个消息作为对话封面消息显示每个组。如果我使用了正常的ID,那么解决问题会非常容易,但是我使用的是UUID,因此我无法使用最小或最大值。所以我需要使用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 
+0

你用'GROUP BY concat'在查询结束?究竟是什么问题? – farhadamjady

+0

group by concat将不会执行这项工作,因为我还需要检索每个组中的第一个项目(至少是第一个id),但按值的顺序分组时,它们是随机的,我不能使用max(id)因为它是UUID –

回答

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)) 
+0

哇!你救了我的一天艾伦!谢谢! :)我不知道我可以做这样的事情max(concat(from_user_id,subject,created_at))。 –

相关问题