2017-03-27 17 views
0

created_at descでソートされたテーブル内のuser_id(1)のすべてのメッセージを返そうとしていますが、より新しいcreated_atに応じてsender_idまたはrecipient_idでグループ化しています。2列でMySQLグループ化

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

が、それはでグループの前で順番をやっているようだ -

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 

を返します。

助けに感謝します。

+0

少なくとも(...) – Ibu

答えて

0

GROUP BYは、集計(合計、カウントなど)を目的としているため、公式の副作用(非推奨となり、将来のバージョンでは保証されていない動作) ORDER BYGROUP BYの後に実行され、最終結果がソートされ、複数の式を取ります。しかし

ORDER BY LEAST(sender_id, recipient_id), created_at DESC 

、あなたのサンプルの結果のすべての行が同じ「最も持っているので:用語のあなたの交換可能な使用は、それはおそらく、それは難しいあなたが探しているが、このサンプル望ましい結果によって行っている正確に理解することができますあなたは、彼らが送信者と受信者、彼らはしているユーザ1が最も最近のポストされているユーザ1が最も最近のポストを取得しようとしている場合

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

: "値は、この可能性があります。

私は最初のクエリで最も新しいポストを送信者として取得し、2番目のクエリで最も最近のポストを受信者として取得します。

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