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

回答編集履歴

2

抜けがあったので訂正

2018/01/01 14:53

投稿

sousuke
sousuke

スコア3830

answer CHANGED
@@ -19,8 +19,8 @@
19
19
  where exists(
20
20
  select 0
21
21
  from message
22
- where message_to_member_no=member.member_no
22
+ where (message_to_member_no=member.member_no and message_from_member_no=$member_no)
23
- or message_from_member_no=member.member_no
23
+ or (message_from_member_no=member.member_no and message_to_member_no=$member_no)
24
24
  limit 1
25
25
  )
26
26
  ```
@@ -28,4 +28,7 @@
28
28
  表示したいデータ「from」「join」と検索条件「where」を明確に区別することが大事だと思います。
29
29
  基本的にjoin句は表示したいデータがある場合にしか使ってはいけません。
30
30
  joinした結果menber_noが同一のものが複数返ってしまい、それを消すためにさらにgroupbyを重ねる
31
- ということをしてしまうからです。上記の解釈で正しいとするとgroupbyは不要になります。
31
+ ということをしてしまうからです。上記の解釈で正しいとするとgroupbyは不要になります。
32
+
33
+ $member_noの記述を忘れていましたので修正。
34
+ 「特定の人へメッセージを送信(または受信)してくれた会員一覧」ですね。

1

追記による訂正

2018/01/01 14:53

投稿

sousuke
sousuke

スコア3830

answer CHANGED
@@ -3,4 +3,29 @@
3
3
  「messageテーブルを会員単位で呼び出す」こととグループ化に関連性や必要性が見いだせません。
4
4
 
5
5
  SQL的にはmessageテーブルを主体にするならば「where句にmessage_to_member_noまたは
6
- message_from_member_noが$member_no」というのがまず最初に来ると思います。
6
+ message_from_member_noが$member_no」というのがまず最初に来ると思います。
7
+
8
+ 追記
9
+ 「メッセージを送信(または受信)してくれた会員一覧」ということで。
10
+ ・表示したいテーブルはmember
11
+ ・memberの検索条件として「messageテーブルの送受信者として履歴がある」
12
+ ということだとするとこんな感じです。
13
+
14
+ ```SQL
15
+ select member.member_no,
16
+ member.member_id,
17
+ member.member_name
18
+ from member
19
+ where exists(
20
+ select 0
21
+ from message
22
+ where message_to_member_no=member.member_no
23
+ or message_from_member_no=member.member_no
24
+ limit 1
25
+ )
26
+ ```
27
+ mysqlの文法にはそれほど強くないので違っているかもしれませんが、SQL的に
28
+ 表示したいデータ「from」「join」と検索条件「where」を明確に区別することが大事だと思います。
29
+ 基本的にjoin句は表示したいデータがある場合にしか使ってはいけません。
30
+ joinした結果menber_noが同一のものが複数返ってしまい、それを消すためにさらにgroupbyを重ねる
31
+ ということをしてしまうからです。上記の解釈で正しいとするとgroupbyは不要になります。