はじめに
MySQLで「視聴ランキング3位までの番組タイトル名を出力せよ」という課題が出た。
副問合せの中で、ORDER BY句とLIMIT句を使い、
ランキングの上位3位を取得しようとしたが、以下エラーになったので、その対処法を記す。
mysql> SELECT program_name
-> FROM program
-> WHERE program_code IN
-> (SELECT program_code
-> FROM viewing_history
-> GROUP BY program_code
-> ORDER BY COUNT(*) DESC
-> LIMIT 3);
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
公式サイトの確認
本エラーについて、公式サイトで調べてみると、エラーメッセージの通りサポートされて
いないと記載があった。
https://dev.mysql.com/doc/refman/8.0/ja/subquery-errors.html
結論
外部にもう一つSELECTクエリを用意して囲ってあげることで、目的のデータを取得できた。
SELECT program_name
FROM program
WHERE program_code IN
+ (SELECT program_code FROM
(SELECT program_code
FROM viewing_history
GROUP BY program_code
ORDER BY COUNT(*) DESC
LIMIT 3)
+ AS popular_program);
解決方法
テーブル別名を付けてLIMITを付けた副問合せを入れ子にしてあげることで取得できるよう
になった。
その際、外のSELECTクエリに対してテーブル別名を付ける必要が出てくるので注意。
'ERROR 1248 (42000): Every derived table must have its own alias'のエラーが出ます。)
--エラーになったSQL
SELECT program_name
FROM program
WHERE program_code IN
(SELECT program_code
FROM viewing_history
GROUP BY program_code
ORDER BY COUNT(*) DESC
LIMIT 3);
--想定通りのデータを取得できた
SELECT program_name
FROM program
WHERE program_code IN
+ (SELECT program_code FROM
(SELECT program_code
FROM viewing_history
GROUP BY program_code
ORDER BY COUNT(*) DESC
LIMIT 3)
+ AS popular_program);
--実行結果
+--------------+
| program_name |
+--------------+
| News Program |
| Sports |
| Comedy |
+--------------+
実行環境および使用したテーブル
【動作環境】
- mysql Ver 8.0.39-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
【使用するテーブル】
テーブル名:viewing_history(視聴履歴)
viewing_history_id | program_code |
---|---|
1 | 2 |
2 | 1 |
3 | 1 |
4 | 2 |
5 | 5 |
6 | 2 |
7 | 5 |
8 | 3 |
9 | 2 |
10 | 5 |
テーブル名: program(番組)
program_code | program_name |
---|---|
1 | News |
2 | Sports |
3 | Drama |
4 | Documentary |
5 | Comedy |
参考資料
まとめ
この方法により、LIMIT句が使えない場合でも行数を制限できました。
他にもよい方法があったら教えていただけますと幸いです。