複雑怪奇なクエリ
新ピクチャレ大会開発作業、今月末には基本機能の完成を目指しているのですが、
どうも暗礁に乗り上げてしまっています。
と言うのも、SQLが難しすぎる!!
いまやりたいのは、各ユーザーごとにそれぞれ同じユーザーIDとステージIDを持つ記録のうち、
最もスコアの大きい記録のみ抽出し、それをスコアの降順に並び替えるという処理。
共通した記録を1つに絞るのはGROUP BY句で実現できるのですが、
同じユーザーIDの記録をグループ化する際、基本的には最も古い記録が代表の記録になります。
しかし記録テーブルは当然新しいほどスコアが高いのでそれでは困る。
SELECT句にMAX関数を使うことで最大スコアを抽出することはできるのですが、
それに付随する情報を持ってくることはできない。
ORDER BY句で並び替えてからグループ化できればそれが一番早いのですが、
SQLの優先度の法則ではGROUP BYよりORDER BYを先に適用することはできない……。
サブクエリを作れば解決できそうな雰囲気はありますが、
最もスコアの高い記録だけを抽出したところで同値はたくさんあるので、
LEFT JOINで繋ぐなどといった処理は現実的ではありません。
かといってユニークIDはランダム値なので使えないし……。
散々ググっているのですが現状まだ解決できていない状況です。誰か教えてくれ。
なんというかSQLって論理思考力を高く求められる気がして、自分には向いていないかも。
そろそろwebデザインをやらせてくれと思いながら取り組んでいました。
とにかく何日も同じところで詰まっているとモチベに強い悪影響を及ぼすので、
このSQL問題はいったん支障の無い形で仮完成としておいて、
スキップして次のタスクに移ることにしました。
そうしないと今月完成も危うくなってしまいそうで……。
ゴールデンウィーク終了時に最低限リリースできることを目標とするならば、猶予は約半月。
今週過ごした感じだとそのうち作業に集中できるのは金・日・月曜日のみなので、
単純計算で作業できる日は11日ということになります。
途中ゴールデンウィークがあるけど、まあ結局確保できる時間は同じくらいでしょう。
1日3時間として33時間……基本機能作成はもう後半戦なので、
これくらいあればできるような気がしますが難解なバグが出てくるとわからないかも。
とにかく今月後半はこれを重点的に進めたいところです。