質問編集履歴

3

2022/01/16 09:26

投稿

ingeniero
ingeniero

スコア10

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,3 @@
1
1
  MySQLで、片方のテーブルにしかないデータをランダムで10件抽出したいと思います。xamppでphpMyAdminを使用しています。
2
2
 
3
-
4
-
5
- 解決しました。
3
+ 自己解決しました。

2

解決のため、不要な文章削除

2022/01/11 12:38

投稿

ingeniero
ingeniero

スコア10

test CHANGED
File without changes
test CHANGED
@@ -2,222 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- wordsテーブルには単語の情報、quizテーブルにはそれぞれの単語のクイズの正不正解の情報があり
6
-
7
- wordsテーブルの主キーで結合可能、ただしいろいろなユーザーの単語のクイズの成績が存在する。下記詳述。
8
-
9
-
10
-
11
- クイズテーブルには、それぞれのユーザーが以前クイズで回答した単語の成績が追加されています。
12
-
13
- wordsテーブルの主キーとusersテーブル(ユーザー情報保管テーブル)の主キーを外部キーにして作成しています。
14
-
15
-
16
-
17
- 単語テーブル
18
-
19
- ```SQL
20
-
21
- CREATE TABLE `words` (
22
-
23
- `id` int(6) NOT NULL,
24
-
25
- `word` char(50) CHARACTER SET utf8 NOT NULL COMMENT '単語',
26
-
27
- `meaning` char(50) CHARACTER SET utf8 NOT NULL COMMENT '意味',
28
-
29
- `example` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '例文',
30
-
31
- `add_datetime` datetime DEFAULT NULL,
32
-
33
- `delete_datetime` datetime DEFAULT NULL,
34
-
35
- `user_id` int(11) NOT NULL,
36
-
37
- `list_id` int(11) NOT NULL COMMENT '単語帳外部キー'
38
-
39
- ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
40
-
41
- ```
42
-
43
- ```SQL
44
-
45
- INSERT INTO `words` (`id`, `word`, `meaning`, `example`, `add_datetime`, `delete_datetime`, `user_id`, `list_id`) VALUES
46
-
47
- (11, 'Poop', 'うんこ\r\n', 'I want to eat poop.\r\n私はうんこ食べたいです。', NULL, '2021-08-31 22:12:33', 1, 1),
48
-
49
- (41, 'parentheses', '括弧()', NULL, '2021-08-18 22:12:46', NULL, 4, 2),
50
-
51
- (46, 'dumb', '〈主に米話〉頭の悪い、ばかな、あほな、\r\n間抜けな、常識のない', 'We're making a dumb Youtube video.', '2021-08-16 23:29:23', NULL, 4, 2),
52
-
53
- (48, 'ignorant', '無知な', 'My grandmother is always igonorant.', NULL, NULL, 4, 2),
54
-
55
- (57, 'I couldn't help but', 'どうしても目が行ってしまう', 'I couldn't help but notice your necklace.\r\nそのネックレスに\r\nどうしても目が行ってしまって。', '2022-01-03 18:02:21', NULL, 1, 1),
56
-
57
- (59, 'I'll walk you through', '1つずつ全体を段階的に説明します', 'Don't worry. I'll walk you through again later.\r\n(心配いらないわ。後でもう一度全体を1つずつ段階的に説明するわね。) ', NULL, NULL, 1, 1),
58
-
59
- (64, 'judgmental', 'すぐに決めつけて批判するような\r\nよく知らないで自分の価値基準だけですぐに批判するような', 'He's judgmental.', '2022-01-03 21:15:13', NULL, 1, 1),
60
-
61
- (74, 'acquaintance', '知人', 'Mr. Collins is an acquaintance rather than a friend.', '2021-08-22 00:03:17', NULL, 1, 1),
62
-
63
- (75, 'Put you down', '悪い方向に無理やり持っていて、批判する的な?\r\nけなす', 'She always puts me down.', '2021-08-22 00:04:00', NULL, 1, 1),
64
-
65
- (76, 'Flirt', 'イチャイチャする', 'If you like him, try flirting with him. He might get the message.\r\n(彼の事が好きだったら、からかったり褒めたりしてみて。彼はあなたの気持ちが分かるかもしれない。)', '2021-08-22 00:04:30', NULL, 1, 1),
66
-
67
- (77, 'crunch time', '締め切り前の踏ん張りどころ', 'I’m in a time crunch with my projects.(=複数のプロジェクトで時間に追われている)', '2021-08-22 00:04:59', NULL, 1, 1),
68
-
69
- (78, 'Pinkeye', '結膜炎', 'My brother farted on my face yesterday\r\nso I think I have a pinkeye now', '2021-08-22 13:08:31', NULL, 1, 1),
70
-
71
- (84, 'sample', 'サンプル', 'this is sample', '2021-09-02 01:40:46', '2021-09-02 09:38:02', 1, 3),
72
-
73
- (85, 'ballsy', '〈米俗〉威勢のいい、心臓の強い、度胸のある、勇敢な、根性のある \r\n\r\n', 'Let's see how ballsy they are.\r\n彼らがどれだけ度胸があるか見てみよう。\r\nMy dad says you're ballsy.\r\n父が、あなたは根性があるって言っていたわ。', '2021-12-11 22:55:33', NULL, 1, 1),
74
-
75
- (86, 'assertive', '〔意見・要求・感情などの表現が〕自信に満ちた態度の、積極的な、はっきり[積極的に]自己主張する', '"I am the type who can't say 'No.'"\r\n"You should be more assertive."\r\n\r\n「私はノーと言えない性格なんです」\r\n「あなたはもう少し積極的に自己主張するべきです」', '2021-09-02 12:10:38', NULL, 1, 1),
76
-
77
- (87, 'give off', '〔光・気体・熱・雰囲気などを〕出す、発する', 'She is giving off an atmosphere of not wanting to be here.\r\n彼女はここにいたくないというそぶりを見せている。', '2021-09-02 12:10:16', NULL, 1, 1),
78
-
79
- (88, 'Sum up', '要約する', 'Can you sum up what you said ?', '2021-09-02 12:07:19', NULL, 1, 1),
80
-
81
- (89, 'sample', 'サンプル', NULL, '2021-12-30 21:57:36', '2021-12-30 21:58:47', 4, 2);
82
-
83
-
84
-
85
- ```
86
-
87
- クイズテーブル
88
-
89
- ```SQL
90
-
91
- CREATE TABLE `quiz` (
92
-
93
- `id` int(11) NOT NULL COMMENT '主キー',
94
-
95
- `correctCount` int(11) NOT NULL COMMENT '単語正解した回数',
96
-
97
- `falseCount` int(11) NOT NULL COMMENT '単語間違えた数',
98
-
99
- `lastCorrectedTime` datetime DEFAULT NULL COMMENT '最後に正解した時間',
100
-
101
- `lastFalseTime` datetime DEFAULT NULL COMMENT '最後に間違えた時間',
102
-
103
- `word_id` int(11) NOT NULL COMMENT '単語外部キー',
104
-
105
- `user_id` int(11) NOT NULL COMMENT 'ユーザー外部キー'
106
-
107
- ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
108
-
109
- ```
110
-
111
-
112
-
113
- ```SQL
114
-
115
- INSERT INTO `quiz` (`id`, `correctCount`, `falseCount`, `lastCorrectedTime`, `lastFalseTime`, `word_id`, `user_id`) VALUES
116
-
117
- (61, 1, 0, '2022-01-08 13:27:32', NULL, 75, 1),
118
-
119
- (62, 1, 0, '2022-01-08 13:27:32', NULL, 78, 1),
120
-
121
- (63, 1, 0, '2022-01-08 13:27:32', NULL, 76, 1),
122
-
123
- (64, 0, 1, NULL, '2022-01-08 13:27:32', 64, 1),
124
-
125
- (72, 2, 0, '2022-01-09 11:34:30', NULL, 77, 4),
126
-
127
- (73, 3, 0, '2022-01-09 11:34:30', NULL, 85, 4),
128
-
129
- (74, 2, 1, '2022-01-08 17:14:56', '2022-01-08 13:30:00', 75, 4),
130
-
131
- (78, 2, 0, '2022-01-09 11:34:30', NULL, 64, 4),
132
-
133
- (79, 1, 0, '2022-01-08 17:14:56', NULL, 78, 4),
134
-
135
- (80, 1, 0, '2022-01-09 11:34:30', NULL, 76, 4),
136
-
137
- (81, 1, 0, '2022-01-09 11:34:30', NULL, 87, 4),
138
-
139
- (82, 1, 0, '2022-01-09 11:34:30', NULL, 74, 4),
140
-
141
- ```
142
-
143
-
144
-
145
- 逆に言うと、今までまだ一度もユーザーがクイズで回答していない単語について、その単語の単語IDとそのユーザーのユーザーIDを外部キーとして併せ持つレコードはクイズテーブルには存在しません。それを利用して今回の要望を実現したいと考えております。
146
-
147
- (単語自体は、他のユーザーが回答している場合、クイズテーブルに追加されていますが、ユーザーIDの外部キがそのユーザーとは異なる。)
148
-
149
-
150
-
151
- つまり、クイズテーブルには存在せず、単語テーブルにのみ存在する各ユーザーのクイズ未出題の単語を抽出したいです。
152
-
153
-
154
-
155
- 一つの単語には複数のユーザーのクイズの成績を保管しているため、単純にNOT EXISTSの条件をwhere quiz.word_id = words.idとするとすべてのユーザーがクイズで回答したことない単語のみが抽出されますが、それは望んでいません。それぞれのユーザー別に抽出したいです。
156
-
157
-
158
-
159
- いろいろ調べて、NOT EXISTSを使用して、WHEREの条件でユーザーIDを指定しているのですが上手くいきません。
160
-
161
- エラーとかはないのですが、何も抽出されません。
162
-
163
-
164
-
165
- NOT EXISTSを書く前に、それぞれのSELECT文を分解して実行しましたが、両方きちんとデータが抽出されていました。
166
-
167
- そして、クイズテーブルに存在せず単語テーブルにのみ存在するデータがあることも確認済みなので、何もデータが抽出されないのは正しい挙動ではありません。
168
-
169
-
170
-
171
- どのようにすれば、上記の要件を満たすSQL文になるでしょうか。
172
-
173
-
174
-
175
- ご教授お願い致します。
176
-
177
-
178
-
179
- 現在書いているSQL文
180
-
181
- ```SQL
182
-
183
- SELECT w.id, w.word, w.meaning
184
-
185
- FROM words w
186
-
187
- WHERE w.delete_datetime IS NULL AND w.list_id = 1
188
-
189
- AND NOT EXISTS (
190
-
191
- SELECT * FROM quiz q
192
-
193
- LEFT JOIN words w ON w.id = q.word_id
194
-
195
- WHERE w.list_id = 1 AND q.user_id = 1
196
-
197
- AND w.delete_datetime IS NULL
198
-
199
- )
200
-
201
- ORDER BY rand()
202
-
203
- LIMIT 10
204
-
205
- ```
206
-
207
- 希望するSELECT結果(ユーザーによってこのNOT IN句に指定しなければいけない単語IDが違うため、動的に取得できる上記を書いている)
208
-
209
- ```SQL
210
-
211
- SELECT w.id, w.word, w.meaning
212
-
213
- FROM words w
214
-
215
- WHERE w.delete_datetime IS NULL AND w.list_id = 1 AND
216
-
217
- w.id NOT IN("75", "76", "78")
218
-
219
- ORDER BY rand()
220
-
221
- LIMIT 10
222
-
223
- ```
5
+ 決しした

1

SQLで使っているテーブルのCREATE TABLE文や何件かINSERT文や希望するSELECT結果の追記

2022/01/11 12:38

投稿

ingeniero
ingeniero

スコア10

test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,134 @@
14
14
 
15
15
 
16
16
 
17
+ 単語テーブル
18
+
19
+ ```SQL
20
+
21
+ CREATE TABLE `words` (
22
+
23
+ `id` int(6) NOT NULL,
24
+
25
+ `word` char(50) CHARACTER SET utf8 NOT NULL COMMENT '単語',
26
+
27
+ `meaning` char(50) CHARACTER SET utf8 NOT NULL COMMENT '意味',
28
+
29
+ `example` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '例文',
30
+
31
+ `add_datetime` datetime DEFAULT NULL,
32
+
33
+ `delete_datetime` datetime DEFAULT NULL,
34
+
35
+ `user_id` int(11) NOT NULL,
36
+
37
+ `list_id` int(11) NOT NULL COMMENT '単語帳外部キー'
38
+
39
+ ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
40
+
41
+ ```
42
+
43
+ ```SQL
44
+
45
+ INSERT INTO `words` (`id`, `word`, `meaning`, `example`, `add_datetime`, `delete_datetime`, `user_id`, `list_id`) VALUES
46
+
47
+ (11, 'Poop', 'うんこ\r\n', 'I want to eat poop.\r\n私はうんこ食べたいです。', NULL, '2021-08-31 22:12:33', 1, 1),
48
+
49
+ (41, 'parentheses', '括弧()', NULL, '2021-08-18 22:12:46', NULL, 4, 2),
50
+
51
+ (46, 'dumb', '〈主に米話〉頭の悪い、ばかな、あほな、\r\n間抜けな、常識のない', 'We're making a dumb Youtube video.', '2021-08-16 23:29:23', NULL, 4, 2),
52
+
53
+ (48, 'ignorant', '無知な', 'My grandmother is always igonorant.', NULL, NULL, 4, 2),
54
+
55
+ (57, 'I couldn't help but', 'どうしても目が行ってしまう', 'I couldn't help but notice your necklace.\r\nそのネックレスに\r\nどうしても目が行ってしまって。', '2022-01-03 18:02:21', NULL, 1, 1),
56
+
57
+ (59, 'I'll walk you through', '1つずつ全体を段階的に説明します', 'Don't worry. I'll walk you through again later.\r\n(心配いらないわ。後でもう一度全体を1つずつ段階的に説明するわね。) ', NULL, NULL, 1, 1),
58
+
59
+ (64, 'judgmental', 'すぐに決めつけて批判するような\r\nよく知らないで自分の価値基準だけですぐに批判するような', 'He's judgmental.', '2022-01-03 21:15:13', NULL, 1, 1),
60
+
61
+ (74, 'acquaintance', '知人', 'Mr. Collins is an acquaintance rather than a friend.', '2021-08-22 00:03:17', NULL, 1, 1),
62
+
63
+ (75, 'Put you down', '悪い方向に無理やり持っていて、批判する的な?\r\nけなす', 'She always puts me down.', '2021-08-22 00:04:00', NULL, 1, 1),
64
+
65
+ (76, 'Flirt', 'イチャイチャする', 'If you like him, try flirting with him. He might get the message.\r\n(彼の事が好きだったら、からかったり褒めたりしてみて。彼はあなたの気持ちが分かるかもしれない。)', '2021-08-22 00:04:30', NULL, 1, 1),
66
+
67
+ (77, 'crunch time', '締め切り前の踏ん張りどころ', 'I’m in a time crunch with my projects.(=複数のプロジェクトで時間に追われている)', '2021-08-22 00:04:59', NULL, 1, 1),
68
+
69
+ (78, 'Pinkeye', '結膜炎', 'My brother farted on my face yesterday\r\nso I think I have a pinkeye now', '2021-08-22 13:08:31', NULL, 1, 1),
70
+
71
+ (84, 'sample', 'サンプル', 'this is sample', '2021-09-02 01:40:46', '2021-09-02 09:38:02', 1, 3),
72
+
73
+ (85, 'ballsy', '〈米俗〉威勢のいい、心臓の強い、度胸のある、勇敢な、根性のある \r\n\r\n', 'Let's see how ballsy they are.\r\n彼らがどれだけ度胸があるか見てみよう。\r\nMy dad says you're ballsy.\r\n父が、あなたは根性があるって言っていたわ。', '2021-12-11 22:55:33', NULL, 1, 1),
74
+
75
+ (86, 'assertive', '〔意見・要求・感情などの表現が〕自信に満ちた態度の、積極的な、はっきり[積極的に]自己主張する', '"I am the type who can't say 'No.'"\r\n"You should be more assertive."\r\n\r\n「私はノーと言えない性格なんです」\r\n「あなたはもう少し積極的に自己主張するべきです」', '2021-09-02 12:10:38', NULL, 1, 1),
76
+
77
+ (87, 'give off', '〔光・気体・熱・雰囲気などを〕出す、発する', 'She is giving off an atmosphere of not wanting to be here.\r\n彼女はここにいたくないというそぶりを見せている。', '2021-09-02 12:10:16', NULL, 1, 1),
78
+
79
+ (88, 'Sum up', '要約する', 'Can you sum up what you said ?', '2021-09-02 12:07:19', NULL, 1, 1),
80
+
81
+ (89, 'sample', 'サンプル', NULL, '2021-12-30 21:57:36', '2021-12-30 21:58:47', 4, 2);
82
+
83
+
84
+
85
+ ```
86
+
87
+ クイズテーブル
88
+
89
+ ```SQL
90
+
91
+ CREATE TABLE `quiz` (
92
+
93
+ `id` int(11) NOT NULL COMMENT '主キー',
94
+
95
+ `correctCount` int(11) NOT NULL COMMENT '単語正解した回数',
96
+
97
+ `falseCount` int(11) NOT NULL COMMENT '単語間違えた数',
98
+
99
+ `lastCorrectedTime` datetime DEFAULT NULL COMMENT '最後に正解した時間',
100
+
101
+ `lastFalseTime` datetime DEFAULT NULL COMMENT '最後に間違えた時間',
102
+
103
+ `word_id` int(11) NOT NULL COMMENT '単語外部キー',
104
+
105
+ `user_id` int(11) NOT NULL COMMENT 'ユーザー外部キー'
106
+
107
+ ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
108
+
109
+ ```
110
+
111
+
112
+
113
+ ```SQL
114
+
115
+ INSERT INTO `quiz` (`id`, `correctCount`, `falseCount`, `lastCorrectedTime`, `lastFalseTime`, `word_id`, `user_id`) VALUES
116
+
117
+ (61, 1, 0, '2022-01-08 13:27:32', NULL, 75, 1),
118
+
119
+ (62, 1, 0, '2022-01-08 13:27:32', NULL, 78, 1),
120
+
121
+ (63, 1, 0, '2022-01-08 13:27:32', NULL, 76, 1),
122
+
123
+ (64, 0, 1, NULL, '2022-01-08 13:27:32', 64, 1),
124
+
125
+ (72, 2, 0, '2022-01-09 11:34:30', NULL, 77, 4),
126
+
127
+ (73, 3, 0, '2022-01-09 11:34:30', NULL, 85, 4),
128
+
129
+ (74, 2, 1, '2022-01-08 17:14:56', '2022-01-08 13:30:00', 75, 4),
130
+
131
+ (78, 2, 0, '2022-01-09 11:34:30', NULL, 64, 4),
132
+
133
+ (79, 1, 0, '2022-01-08 17:14:56', NULL, 78, 4),
134
+
135
+ (80, 1, 0, '2022-01-09 11:34:30', NULL, 76, 4),
136
+
137
+ (81, 1, 0, '2022-01-09 11:34:30', NULL, 87, 4),
138
+
139
+ (82, 1, 0, '2022-01-09 11:34:30', NULL, 74, 4),
140
+
141
+ ```
142
+
143
+
144
+
17
145
  逆に言うと、今までまだ一度もユーザーがクイズで回答していない単語について、その単語の単語IDとそのユーザーのユーザーIDを外部キーとして併せ持つレコードはクイズテーブルには存在しません。それを利用して今回の要望を実現したいと考えております。
18
146
 
19
147
  (単語自体は、他のユーザーが回答している場合、クイズテーブルに追加されていますが、ユーザーIDの外部キがそのユーザーとは異なる。)
@@ -48,19 +176,25 @@
48
176
 
49
177
 
50
178
 
179
+ 現在書いているSQL文
180
+
51
- ```SQL
181
+ ```SQL
52
-
182
+
53
- SELECT *
183
+ SELECT w.id, w.word, w.meaning
54
184
 
55
185
  FROM words w
56
186
 
187
+ WHERE w.delete_datetime IS NULL AND w.list_id = 1
188
+
57
- WHERE NOT EXISTS (
189
+ AND NOT EXISTS (
58
190
 
59
191
  SELECT * FROM quiz q
60
192
 
61
193
  LEFT JOIN words w ON w.id = q.word_id
62
194
 
63
- WHERE q.user_id = 4
195
+ WHERE w.list_id = 1 AND q.user_id = 1
196
+
197
+ AND w.delete_datetime IS NULL
64
198
 
65
199
  )
66
200
 
@@ -69,3 +203,21 @@
69
203
  LIMIT 10
70
204
 
71
205
  ```
206
+
207
+ 希望するSELECT結果(ユーザーによってこのNOT IN句に指定しなければいけない単語IDが違うため、動的に取得できる上記を書いている)
208
+
209
+ ```SQL
210
+
211
+ SELECT w.id, w.word, w.meaning
212
+
213
+ FROM words w
214
+
215
+ WHERE w.delete_datetime IS NULL AND w.list_id = 1 AND
216
+
217
+ w.id NOT IN("75", "76", "78")
218
+
219
+ ORDER BY rand()
220
+
221
+ LIMIT 10
222
+
223
+ ```