回答編集履歴

4

kaisetu

2019/07/11 13:23

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -82,6 +82,14 @@
82
82
 
83
83
  ```
84
84
 
85
+ ※解説
86
+
87
+ where not existsは相関サブクエリといいます。
88
+
89
+ moviesのmidを利用して、サブクエリ内50以下の評価があるmidを
90
+
91
+ not existsで反転して評価がないものを抽出しています
92
+
85
93
 
86
94
 
87
95
  # 検証2
@@ -111,3 +119,13 @@
111
119
  order by avg_rating desc
112
120
 
113
121
  ```
122
+
123
+ ※解説
124
+
125
+ 単純にサブクエリないでmidごとの平均ratingを計算し
126
+
127
+ n件以上をhavingで抽出しています
128
+
129
+ group by~having構文は最低限覚える必要があるSQLの一つです
130
+
131
+ あとはサブクエリとしてmovieに結合しています

3

調整

2019/07/11 13:23

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -81,3 +81,33 @@
81
81
  where mid=t1.mid)
82
82
 
83
83
  ```
84
+
85
+
86
+
87
+ # 検証2
88
+
89
+ サンプル数が少ないのでとりあえず2件以上評価があるもの
90
+
91
+ mid=1,2とその平均評価
92
+
93
+ ```SQL
94
+
95
+ select t1.mid,t1.title,t2.avg_rating
96
+
97
+ from movies as t1
98
+
99
+ inner join (
100
+
101
+ select mid,avg(rating) as avg_rating
102
+
103
+ from ratings
104
+
105
+ group by mid
106
+
107
+ having count(*)>=2
108
+
109
+ ) as t2 on t1.mid=t2.mid
110
+
111
+ order by avg_rating desc
112
+
113
+ ```

2

調整

2019/07/11 11:23

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -21,3 +21,63 @@
21
21
  的なことではないのでしょうか?
22
22
 
23
23
  ※質問者さんの意向にあわせて不等号を逆にしました
24
+
25
+
26
+
27
+ # 検証1
28
+
29
+
30
+
31
+ ざっくりデータを削ります
32
+
33
+ ```SQL
34
+
35
+ create table movies(mid int primary key,title varchar(100));
36
+
37
+ insert into movies values(1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd'),(5,'eee'),(6,'fff');
38
+
39
+
40
+
41
+ create table users(uid int primary key,name varchar(10),age int);
42
+
43
+ insert into users values(1,'AAA',30),(2,'BBB',40),(3,'CCC',55),(4,'DDD',60);
44
+
45
+
46
+
47
+ create table ratings(rid int primary key,uid int,mid int,rating int);
48
+
49
+ insert into ratings values(1,1,1,10),(2,1,2,20),(3,2,1,15),(4,2,2,20),(5,2,3,12),(6,4,2,30),(7,5,4,20);
50
+
51
+
52
+
53
+ select * from movies as t1
54
+
55
+ left join ratings as t2 on t1.mid = t2.mid
56
+
57
+ and ratings.uid = users.uid
58
+
59
+ and users.age < 50;
60
+
61
+ ```
62
+
63
+ 上記50以下のユーザーuid=1,2が評価したタイトルはmid=1,2,3
64
+
65
+ 評価していないのはmid=4,5,6
66
+
67
+
68
+
69
+ ```SQL
70
+
71
+ select * from movies as t1 where
72
+
73
+ not exists(
74
+
75
+ select 1 from ratings as t2
76
+
77
+ inner join users as t3 on t2.uid = t3.uid
78
+
79
+ and t3.age < 50
80
+
81
+ where mid=t1.mid)
82
+
83
+ ```

1

chousei

2019/07/11 11:15

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -14,8 +14,10 @@
14
14
 
15
15
  and ratings.userid = users.userid
16
16
 
17
- and users.age > 50;
17
+ and users.age < 50;
18
18
 
19
19
  ```
20
20
 
21
21
  的なことではないのでしょうか?
22
+
23
+ ※質問者さんの意向にあわせて不等号を逆にしました