2016-12-03 5 views
0

私はすでに数時間これに取り組んでいます。メッセージングシステムをコーディングしていて、テーブルには次の列があります。MySQLグループをconcat値で取得し、各グループ内の最初のID(UUID)を取得します

ID(UUID)| from_user_id(uuid)| to_user_id(uuid)|テーマ|ボディー| created_at

受信トレイのページで件名+ from_user_idでグループ化された結果を取得する必要があります。これは、サブジェクトが同じであれば、それは別のダイアログであり、他のユーザーが同じサブジェクトを持つメッセージを送信する場合は、from_user_idをサブジェクトと連結して他のダイアログとマージされないようにする必要があるからです。

第2のことは、各グループについて、最初のメッセージをダイアログカバーメッセージとして表示する必要があることです。私は通常の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 
+0

あなたがで 'グループを使用しなかったためにサブクエリを必要としますクエリの最後に「concat'?正確に何が問題なのですか? – farhadamjady

+0

concatによるグループは、各グループの最初のアイテム(少なくとも最初のid)を取得する必要があるため、値の順序によるグループ化がグループ内でランダムであり、max(id)を使用できないため、それはUUIDなので –

答えて

1

は、基本的には、各スレッドに を最後のメッセージを識別し、それらの最後のmesssagesのそれぞれから詳細を取得することサブクエリに対して選択

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

うわー!あなたは私の日を救ったアラン!ありがとうございました! :)私はこの最大(concat(from_user_id、件名、created_at))のような何かをすることができるか分からなかった。 –

関連する問題