teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

MySQL5に対応したSQLを追記

2021/02/28 03:13

投稿

neko_the_shadow
neko_the_shadow

スコア2395

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
+ ```