回答編集履歴
4
再び3つ目がダメ
answer
CHANGED
@@ -67,9 +67,17 @@
|
|
67
67
|
chat as c
|
68
68
|
INNER JOIN chat_group as cg
|
69
69
|
ON c.chat_group_id = cg.id
|
70
|
+
LEFT JOIN (
|
71
|
+
SELECT
|
72
|
+
cr.*
|
73
|
+
FROM
|
70
|
-
|
74
|
+
chat_read as cr
|
75
|
+
INNER JOIN staff as s
|
76
|
+
ON cr.staff_id = s.id
|
77
|
+
WHERE
|
78
|
+
s.name = 'foo_staff'
|
79
|
+
) as cr
|
71
80
|
ON c.id = cr.chat_id
|
72
|
-
AND cr.staff_id IN(SELECT id FROM staff WHERE name = 'foo_staff')
|
73
81
|
WHERE
|
74
82
|
cr.id IS NOT NULL -- chat_readのid列がNULLか否かでデータ有無を判断できる。
|
75
83
|
```
|
3
3つ目のサンプルが誤ってそう
answer
CHANGED
@@ -54,7 +54,7 @@
|
|
54
54
|
|
55
55
|
|
56
56
|
#あるstaffの名前だけが事前に分かる場合
|
57
|
-
この場合はstaffテーブルも
|
57
|
+
この場合はstaffテーブルも検索対象に含める必要があります。
|
58
58
|
|
59
59
|
その場合の検索方法の例を記載します。
|
60
60
|
以下は同じくfoo_staffのデータを検索してます。
|
@@ -69,9 +69,7 @@
|
|
69
69
|
ON c.chat_group_id = cg.id
|
70
70
|
LEFT JOIN chat_read as cr
|
71
71
|
ON c.id = cr.chat_id
|
72
|
-
LEFT JOIN staff as s
|
73
|
-
ON cr.staff_id = s.id
|
74
|
-
AND
|
72
|
+
AND cr.staff_id IN(SELECT id FROM staff WHERE name = 'foo_staff')
|
75
73
|
WHERE
|
76
74
|
cr.id IS NOT NULL -- chat_readのid列がNULLか否かでデータ有無を判断できる。
|
77
75
|
```
|
2
表記ミス修正
answer
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
この場合は結合テーブルは質問者さんのやり方でも問題ありません。
|
7
7
|
ただ結合条件を一部変更する必要があります。
|
8
8
|
|
9
|
-
以下はfoo_staff(staff_id)の**既読メッセージを取得するクエリ**です。
|
9
|
+
以下はfoo_staff(staff_id = 2)の**既読メッセージを取得するクエリ**です。
|
10
10
|
(※今回の質問の参考になるよう一部非効率なやり方をしてます)
|
11
11
|
|
12
12
|
```SQL
|
1
参考ソース追記とミス修正
answer
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
chat as c
|
19
19
|
INNER JOIN chat_group as cg
|
20
20
|
ON c.chat_group_id = cg.id
|
21
|
-
LEFT JOIN chat_read cr
|
21
|
+
LEFT JOIN chat_read as cr
|
22
22
|
ON c.id = cr.chat_id
|
23
23
|
AND cr.staff_id = 2 -- 「foo_staff」のidを指定
|
24
24
|
WHERE
|
@@ -67,13 +67,41 @@
|
|
67
67
|
chat as c
|
68
68
|
INNER JOIN chat_group as cg
|
69
69
|
ON c.chat_group_id = cg.id
|
70
|
-
LEFT JOIN chat_read cr
|
70
|
+
LEFT JOIN chat_read as cr
|
71
71
|
ON c.id = cr.chat_id
|
72
|
-
LEFT JOIN staff s
|
72
|
+
LEFT JOIN staff as s
|
73
73
|
ON cr.staff_id = s.id
|
74
74
|
AND s.name = 'foo_staff'
|
75
|
+
WHERE
|
76
|
+
cr.id IS NOT NULL -- chat_readのid列がNULLか否かでデータ有無を判断できる。
|
75
77
|
```
|
76
78
|
|
79
|
+
EXISTS版を投下し忘れてたので投下。
|
80
|
+
```SQL
|
81
|
+
SELECT
|
82
|
+
c.*
|
83
|
+
, cg.*
|
84
|
+
FROM
|
85
|
+
chat as c
|
86
|
+
INNER JOIN chat_group as cg
|
87
|
+
ON c.chat_group_id = cg.id
|
88
|
+
WHERE
|
89
|
+
-- 下記は該当レコードある場合に条件成立
|
90
|
+
-- レコードがない場合に条件成立する構文に「NOT EXISTS」もある
|
91
|
+
EXISTS(
|
92
|
+
-- foo_staffの既読情報を取得するクエリ
|
93
|
+
SELECT
|
94
|
+
*
|
95
|
+
FROM
|
96
|
+
chat_read as cr
|
97
|
+
INNER JOIN staff as s
|
98
|
+
ON cr.staff_id = s.id
|
99
|
+
WHERE
|
100
|
+
cr.chat_id = c.id
|
101
|
+
AND s.name = 'foo_staff'
|
102
|
+
)
|
103
|
+
```
|
104
|
+
|
77
105
|
#最後に
|
78
106
|
上記を参考に条件部や、クエリを再考してみてください。
|
79
107
|
|