回答編集履歴

1

解説ノ追記

2016/05/12 02:03

投稿

takushi168
takushi168

スコア228

test CHANGED
@@ -49,3 +49,93 @@
49
49
  WHERE 1 = 1 AND ((area_id Like "1") OR (area_id Like "2") OR (area_id Like "3")) AND ((pid LIKE "1") OR (pid LIKE "3")) GROUP BY kid
50
50
 
51
51
  ```
52
+
53
+
54
+
55
+ (追記:解説?)
56
+
57
+
58
+
59
+ 以下のような bukken_kodawari テーブルがあったとします。
60
+
61
+ ----
62
+
63
+ kid pid
64
+
65
+ ----
66
+
67
+ 1 1
68
+
69
+ 1 4
70
+
71
+ 2 1
72
+
73
+ 2 3
74
+
75
+ 2 4
76
+
77
+ ----
78
+
79
+
80
+
81
+ ```sql
82
+
83
+ SELECT kid, pid
84
+
85
+ FROM bukken_kodawari
86
+
87
+ WHERE pid IN (1,3)
88
+
89
+ ```
90
+
91
+ このクエリだと以下のようになりますね。
92
+
93
+ ----
94
+
95
+ kid pid
96
+
97
+ ----
98
+
99
+ 1 1
100
+
101
+ 2 1
102
+
103
+ 2 3
104
+
105
+ ----
106
+
107
+
108
+
109
+ これをkidごとにまとめて、含まれる行数を求めたいのでCOUNTを使います。
110
+
111
+ ```sql
112
+
113
+ SELECT kid,COUNT(pid) AS `cnt`
114
+
115
+ FROM bukken_kodawari
116
+
117
+ WHERE pid IN (1,3)
118
+
119
+ GROUP BY kid
120
+
121
+ ```
122
+
123
+ これが、わたしが記載したクエリ(のJOIN部分)ですね。
124
+
125
+ これだけを実行するとこうなります。
126
+
127
+ ----
128
+
129
+ kid cnt
130
+
131
+ ----
132
+
133
+ 1 1
134
+
135
+ 2 2
136
+
137
+ ----
138
+
139
+ 1と3の両方をpidに持つkidのレコード数は必ず2になるので、
140
+
141
+ 最初に提示したクエリの、JOINの外でカウントが2のものだけを抽出しているわけです。