質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

20607閲覧

【MySQL】グループ単位で上位n件を取得するSQL文を作成したい。

sanset

総合スコア186

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2015/12/21 08:43

編集2015/12/21 09:00

グループ毎に上位n件を取得するSQL文を発行したいです。
こういった条件でSELECTする際に、ググって調べてたところ、
まさにやりたかったことをそのまま書いてある記事を見つけました。[リンク]

実際にこちらで試そうと思い、リンク先のテーブル、クエリ同じものを用意しました。
しかし、MySQL環境で、こちらの記事のブログの記述を真似して発行すると、

MySql

1ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

というエラーが出て発行できません。
このMySqlのバージョンではサブクエリにlimitは使用できない、という意味だと思うのですが、バージョンは5.6.23です。レンタルサーバーなので、バージョンの変更は行えません。
上記リンクのクエリを元に、エラーを吐かずクエリを実行させる方法はありますか?
もしくは、このバージョンでは不可能だとして、その他に「グループ毎に上位n件を取得するSQL文」はありますでしょうか?(ここのネット情報は本当に少なかったと思います(涙))
どなたかご教示お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/21 08:55

どんなテーブルの定義で、どんなSQLを実行したのかわからないと回答できません。
sanset

2015/12/21 09:01 編集

申し訳ありません。テーブル、発行したSQL共にリンク先のものと同じです。
退会済みユーザー

退会済みユーザー

2015/12/21 09:10 編集

MySQLを使う以上は実行不可能なSQLですね。バージョンをあげても、現在時点では不可能です。参照先は PostgreSQL ですし。ストアドしか方法はなさそう…
sanset

2015/12/24 11:49

諦めも肝心ですね。。。ありがとうございます。
guest

回答2

0

ベストアンサー

sql

1SELECT * 2FROM Table1 t1 3WHERE 2 >= ( 4 SELECT COUNT(*) 5 FROM Table1 t2 6 WHERE t1.category = t2.category 7 AND t2.point >= t1.point 8) 9ORDER BY category,point desc

評価行と同じcategoryで、評価行よりpointが大きい行の数を数えて、それがn以下なら採用する流れです。
同じポイントの行が複数存在する可能性のある場合は注意が必要です。
このSQLの場合は同着2位は省かれます。
(元の紹介ページのSQLでは同着2位は2行目になるかどうかがmysqlの判断にゆだねられるので、選択されたりされなかったりするかも知れません。)

whereの左辺に数値持ってきたり、それとサブクエリの結果を比較がmysqlのどのバージョンでも動作したかは余り自信がないですが、一応paiza.io このサイトのmysqlでは動作しました。

投稿2015/12/21 15:05

編集2015/12/21 15:25
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanset

2015/12/24 11:48

ご連絡ありがとうございます。少し時間かかりましたがこちらで結果が出せました。 分かりやすい解説まで頂きありがとうございます!
guest

0

SQL

1select id, category, point, name 2from 3( 4 select *, 5 @rank := if (@category = category, @rank + 1, 1) as rank, 6 @category := category as dummy_field 7 from Table1, (select @rank := 0, @category := 0) as dummy_table 8 order by category, point desc 9) as t 10where t.rank <= 2 11order by category, point desc

こんな感じでしょうか?
一応 phpMyAdmin にて同じ結果が出力されることを確認しております。

投稿2015/12/21 10:12

編集2015/12/21 10:14
hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanset

2015/12/24 11:48

ありがとうございます!こちらでも結果が出せました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問