1
1

【MySQL】副問合せで、LIMITが使用できない

Last updated at Posted at 2024-08-04

はじめに

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句が使えない場合でも行数を制限できました。
他にもよい方法があったら教えていただけますと幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1