質問編集履歴

3

2021/01/24 09:53追記

2021/01/24 00:54

投稿

katahik
katahik

スコア79

test CHANGED
File without changes
test CHANGED
@@ -198,7 +198,7 @@
198
198
 
199
199
  ```
200
200
 
201
- ## 2021/01/24追記
201
+ ## 2021/01/24 06:57追記
202
202
 
203
203
  別テーブル(itemsテーブル)に対して実験的に下記SQLを試したところ
204
204
 
@@ -292,6 +292,64 @@
292
292
 
293
293
 
294
294
 
295
+ ## 2021/01/24 09:53追記
296
+
297
+ MySQLバージョン8からRANK()関数が使えるようになっていましたが、エイリアスにrankとすると、キーワード関係でエラーが発生していました。
298
+
299
+ そこで、下記のように修正することで、正しく動作しました。
300
+
301
+ ```
302
+
303
+ winners_in_index =
304
+
305
+ "SELECT
306
+
307
+ competition_id,
308
+
309
+ MIN(id) AS id,
310
+
311
+ MIN(image) AS image,
312
+
313
+ MIN(name) AS name,
314
+
315
+ MIN(count) AS count,
316
+
317
+ MIN(rnk) AS rnk
318
+
319
+ FROM
320
+
321
+ (SELECT
322
+
323
+ *,
324
+
325
+ RANK() OVER (PARTITION BY competition_id ORDER BY COUNT DESC) rnk
326
+
327
+ FROM (SELECT
328
+
329
+ items.competition_id,
330
+
331
+ items.id,
332
+
333
+ items.image,
334
+
335
+ items.name,
336
+
337
+ count(*) AS count
338
+
339
+ FROM
340
+
341
+ chosenitems INNER JOIN items ON chosenitems.item_id = items.id
342
+
343
+ GROUP BY items.competition_id,items.id) AS t) AS tt
344
+
345
+ WHERE rnk = 1
346
+
347
+ GROUP BY competition_id;"
348
+
349
+ ```
350
+
351
+
352
+
295
353
 
296
354
 
297
355
  # 環境

2

2021/01/24追記

2021/01/24 00:54

投稿

katahik
katahik

スコア79

test CHANGED
File without changes
test CHANGED
@@ -198,6 +198,100 @@
198
198
 
199
199
  ```
200
200
 
201
+ ## 2021/01/24追記
202
+
203
+ 別テーブル(itemsテーブル)に対して実験的に下記SQLを試したところ
204
+
205
+ - itemsテーブル
206
+
207
+
208
+
209
+ |id|name|points|
210
+
211
+ |:--|:--:|--:|
212
+
213
+ |1|a|image1|1|
214
+
215
+ |2|b|image2|1|
216
+
217
+ |2|c|image2|1|
218
+
219
+ |2|d|image2|1|
220
+
221
+ |2|e|image5|2|
222
+
223
+ |3|f|image9|2|
224
+
225
+ |4|g|image4|2|
226
+
227
+ |5|h|image5|2|
228
+
229
+ (続きがあります)
230
+
231
+ ```
232
+
233
+ SET @rnk=0,@before_line_points=0; SELECT CASE WHEN @before_line_points = points THEN @rnk ELSE @rnk:=@rnk+1 END AS rnk,name,@before_line_points:=points AS points FROM items ORDER BY points desc;
234
+
235
+ ```
236
+
237
+ 以下の結果になりました。
238
+
239
+ ```
240
+
241
+ Query OK, 0 rows affected (0.00 sec)
242
+
243
+
244
+
245
+ +------+-----------------+--------+
246
+
247
+ | rnk | name | points |
248
+
249
+ +------+-----------------+--------+
250
+
251
+ | 1 | book9 | 99 |
252
+
253
+ | 2 | book10 | 98 |
254
+
255
+ | 3 | color10 | 97 |
256
+
257
+ | 4 | color5 | 96 |
258
+
259
+ | 4 | movie2 | 96 |
260
+
261
+ | 5 | book4 | 94 |
262
+
263
+ | 5 | book3 | 94 |
264
+
265
+ ```
266
+
267
+ ここまでは、合っていると推測しました。
268
+
269
+ そこで、このSQLを組みました。
270
+
271
+ ```
272
+
273
+ SET @rnk=0,@before_line_count=0; SELECT * FROM (SELECT CASE WHEN @before_line_count = count THEN @rnk ELSE @rnk:=@rnk+1 END AS rnk,*,@before_line_count:=count AS count FROM (SELECT items.competition_id,items.id,items.image,items.name,count(*) AS count FROM chosenitems INNER JOIN items ON chosenitems.item_id = items.id GROUP BY items.competition_id,items.id) AS t ORDER BY count desc) AS tt;
274
+
275
+ ```
276
+
277
+ すると、以下のエラーがでました。
278
+
279
+ ```
280
+
281
+ Query OK, 0 rows affected (0.00 sec)
282
+
283
+
284
+
285
+ ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*,@before_line_count:=count AS count FROM (SELECT items.competition_id,items.id,' at line 1
286
+
287
+ ```
288
+
289
+
290
+
291
+ どなたか、わかる方がいらっしゃいましたら、ご教授いただければ幸いです。
292
+
293
+
294
+
201
295
 
202
296
 
203
297
  # 環境

1

修正

2021/01/23 21:57

投稿

katahik
katahik

スコア79

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  railsでアプリを作成しております。
2
2
 
3
- DBをSQLite3からMySQLへ変更し、SQL文を修正していたところ、SQL文の書き方で詰まってしまったため、ご教授い。
3
+ DBをSQLite3からMySQLへ変更し、SQL文を修正していたところ、SQL文の書き方で詰まってしまったため、ご教授いたければ幸です
4
4
 
5
5
 
6
6