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

回答編集履歴

4

再び3つ目がダメ

2016/09/24 13:37

投稿

Panzer_vor
Panzer_vor

スコア1636

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
- LEFT JOIN chat_read as cr
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つ目のサンプルが誤ってそう

2016/09/24 13:37

投稿

Panzer_vor
Panzer_vor

スコア1636

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 s.name = 'foo_staff'
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

表記ミス修正

2016/09/24 13:32

投稿

Panzer_vor
Panzer_vor

スコア1636

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

参考ソース追記とミス修正

2016/09/24 13:19

投稿

Panzer_vor
Panzer_vor

スコア1636

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