回答編集履歴

1

MySQL5に対応したSQLを追記

2021/02/28 03:13

投稿

neko_the_shadow
neko_the_shadow

スコア2349

test CHANGED
@@ -69,3 +69,65 @@
69
69
 
70
70
 
71
71
  まずユーザ2とやり取りしたメッセージ一覧を取得したのち、RANK関数を使って、やり取りした相手ごとにメッセージに順位を付けます。このとき、より新しいメッセージごとに若い順位をつけるようにします。最後に、最新のメッセージ(=順位が1位のメッセージ)を取得しつつ、userテーブルを結合します。
72
+
73
+
74
+
75
+ ---
76
+
77
+
78
+
79
+ *2021-02-28 12:11 追記*
80
+
81
+
82
+
83
+ MySQL5ということはWITHもRANKも利用できないと思います。であれば以下のようなSQLになるかと思います。
84
+
85
+
86
+
87
+ ```SQL
88
+
89
+ SELECT
90
+
91
+ s.id,
92
+
93
+ s.to_user_id,
94
+
95
+ u.name,
96
+
97
+ s.message,
98
+
99
+ s.created_at
100
+
101
+ FROM (
102
+
103
+ SELECT id, from_user_id, to_user_id, message, created_at FROM message
104
+
105
+ UNION ALL
106
+
107
+ SELECT id, to_user_id, from_user_id, message, created_at FROM message
108
+
109
+ ) AS s
110
+
111
+ JOIN user AS u ON s.to_user_id = u.id
112
+
113
+ WHERE from_user_id = 2
114
+
115
+ AND NOT EXISTS (
116
+
117
+ SELECT *
118
+
119
+ FROM (
120
+
121
+ SELECT id, from_user_id, to_user_id, message, created_at FROM message
122
+
123
+ UNION ALL
124
+
125
+ SELECT id, to_user_id, from_user_id, message, created_at FROM message
126
+
127
+ ) AS t
128
+
129
+ WHERE s.to_user_id = t.to_user_id AND s.created_at < t.created_at
130
+
131
+ )
132
+
133
+ ```