2017-03-27 176 views
0

我試圖返回所有的消息,表格中的user_id(1)按照created_at desc排序,但根據created_at是否更新,按sender_id或recipient_id進行分組。MySQL按2列分組

messages 
sender_id | recipient_id | text | created_at 
1 | 2 | hey | 2017-03-26 04:00:00 
1 | 2 | tees | 2017-03-26 00:00:00 
2 | 1 | rrr | 2017-03-27 00:00:00 
3 | 1 | edd | 2017-03-27 00:00:00 
1 | 3 | cc3 | 2017-02-27 00:00:00 

理想的情況下它會返回

2 | 1 | rrr | 2017-03-27 00:00:00 
1 | 3 | cc3 | 2017-02-27 00:00:00 

查詢我有多遠 -

select * 
from messages 
where (
     sender_id = 1 
     or recipient_id = 1 
     ) 
group by least(sender_id, recipient_id) 
order by created_at desc 

,但現在看來,這是由一羣由之前做的順序。

任何幫助將是值得讚賞的。

+0

order by least(...) – Ibu

回答

0

GROUP BY旨在用於聚合(總和,計數等等),它所下的事實只不過是官方的副作用(在以後的版本中被棄用,而不是保證的行爲)。 ORDER BYGROUP BY之後完成,它對最終結果進行排序,並且可以採用多個表達式。您可以互換使用的術語使得它很難理解你正在尋找什麼,而是通過樣品所需的這種結果會是可能的:

ORDER BY LEAST(sender_id, recipient_id), created_at DESC 

然而,因爲在你的樣品結果的所有行具有相同的「最「值,它可能是這樣的:

ORDER BY LEAST(sender_id, recipient_id), created_at DESC 
0

如果您正在試圖將最新的帖子由用戶1,他們是發件人和最近的職位由用戶1,他們是一個收件人。

我會做第一個查詢得到最近的職位作爲發件人和第二個獲取最新的職位作爲收件人的工會。

select * 
from messages 
join 
(
select 
    sender_id, 
    max(created_at) as max1 
from messages 
where 
    sender_id = 1 
group by 
    sender_id 
) t1 
on messages.created_at = t1.max1 

union 

select * 
from messages 
join 
(
select 
    recipient_id, 
    max(created_at) as max2 
from messages 
where 
    recipient_id = 1 
group by 
    recipient_id 
) t2 
on messages.created_at = t2.max2