なんか久々にmysqlネタです。・・・しばらくmysqlを組んでなかったってことですね(汗)
さて、mysqlにはMAX()やMIN()関数があり、最大、最小は簡単に取り出せるのですが、n番目となるとちょっと工夫がいる。
サンプル
こんな商品番号、日付、スコアデータがあると想定
商品番号 id | 日付 tdate | スコア score |
---|---|---|
1 | 2019-12-19 | 10 |
2 | 2019-12-19 | 8 |
1 | 2019-12-18 | 15 |
2 | 2019-12-18 | 3 |
1 | 2019-12-17 | 9 |
2 | 2019-12-17 | 6 |
ここから、例えば2番目の2019-12-18や3番目の2019-12-17という特定の日付のみのデータをスコア順に拾いたいとする。
考え方の基本形
SELECT *
FROM scoreTable
WHERE tdate = (ここをどうするか!)
ORDER BY score DESC
LIMIT 30
特定の日付を拾いたいのでこの形で考えていきます
まずはMAX()を使った1番大きい日付のデータのみを取り出す
SELECT *
FROM scoreTable
WHERE tdate = (SELECT MAX(tdate) FROM scoreTable)
ORDER BY score DESC
LIMIT 30
まぁここまではだいたい思いつく
2番目に大きい日付のデータのみを取り出す
SELECT *
FROM scoreTable
WHERE tdate = (SELECT tdate FROM scoreTable GROUP BY tdate ORDER BY tdate DESC LIMIT 1,1)
ORDER BY score DESC
LIMIT 30
はい。ここまで理解できればn番目は簡単です。
n番目に大きい日付
SELECT *
FROM scoreTable
WHERE tdate = (SELECT tdate FROM scoreTable GROUP BY tdate ORDER BY tdate DESC LIMIT [n番目-1],1)
ORDER BY score DESC
LIMIT 30
[n番目-1] の部分を取り出したいn番目を入れてね。10番目だったら1を引いて9だよ!
コメント