回答編集履歴
1
MySQL5に対応したSQLを追記
answer
CHANGED
@@ -33,4 +33,35 @@
|
|
33
33
|
WHERE RNK = 1;
|
34
34
|
```
|
35
35
|
|
36
|
-
まずユーザ2とやり取りしたメッセージ一覧を取得したのち、RANK関数を使って、やり取りした相手ごとにメッセージに順位を付けます。このとき、より新しいメッセージごとに若い順位をつけるようにします。最後に、最新のメッセージ(=順位が1位のメッセージ)を取得しつつ、userテーブルを結合します。
|
36
|
+
まずユーザ2とやり取りしたメッセージ一覧を取得したのち、RANK関数を使って、やり取りした相手ごとにメッセージに順位を付けます。このとき、より新しいメッセージごとに若い順位をつけるようにします。最後に、最新のメッセージ(=順位が1位のメッセージ)を取得しつつ、userテーブルを結合します。
|
37
|
+
|
38
|
+
---
|
39
|
+
|
40
|
+
*2021-02-28 12:11 追記*
|
41
|
+
|
42
|
+
MySQL5ということはWITHもRANKも利用できないと思います。であれば以下のようなSQLになるかと思います。
|
43
|
+
|
44
|
+
```SQL
|
45
|
+
SELECT
|
46
|
+
s.id,
|
47
|
+
s.to_user_id,
|
48
|
+
u.name,
|
49
|
+
s.message,
|
50
|
+
s.created_at
|
51
|
+
FROM (
|
52
|
+
SELECT id, from_user_id, to_user_id, message, created_at FROM message
|
53
|
+
UNION ALL
|
54
|
+
SELECT id, to_user_id, from_user_id, message, created_at FROM message
|
55
|
+
) AS s
|
56
|
+
JOIN user AS u ON s.to_user_id = u.id
|
57
|
+
WHERE from_user_id = 2
|
58
|
+
AND NOT EXISTS (
|
59
|
+
SELECT *
|
60
|
+
FROM (
|
61
|
+
SELECT id, from_user_id, to_user_id, message, created_at FROM message
|
62
|
+
UNION ALL
|
63
|
+
SELECT id, to_user_id, from_user_id, message, created_at FROM message
|
64
|
+
) AS t
|
65
|
+
WHERE s.to_user_id = t.to_user_id AND s.created_at < t.created_at
|
66
|
+
)
|
67
|
+
```
|