じぶんメモ

プログラミングのメモ、日常のメモとか。

has_manyな関連テーブルのレコードのカラムでソート

チャットとかchat(チャットルーム) has_many chat_messages(チャットのメッセージ)みたいなテーブル構造になると思うが、 この時、チャットルームをメッセージが来た順に並び変えたいとかあると思う。 メッセージの投稿日時がmaxのもので比較してソートする必要があるが、書き方がわからなかったので調べた。

テーブル構造はこんな感じ

chatsテーブル

idID
created_at作成日時
updated_at更新日時

chat_messagesテーブル

idID
chat_idチャットID
message本文
created_at作成日時
updated_at更新日時
select chats.*, max_created_at from chats
left outer join (
  select max(chat_messages.created_at) max_created_at , chat_id
  from chat_messages
  group by chat_id
) cm on chats.id = cm.chat_id
order by max_created_at desc;