1435329490 MySQL - SQL文の記述をお願いします。


●データベーステーブル内容
毎日の映画のランキングを記録しているテーブルです。
カテゴリ毎に、日次で映画タイトルと当日のランキングを記録しています。

●やりたいこと
前日と比較し、カテゴリ別で、
ランキングが急上昇した映画タイトル名を上位20個抽出したい。


これが出来るSQLを教えて下さい。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2015/06/26 23:38:10
  • 終了:2015/07/03 23:40:04

回答(2件)

id:pogpi No.1

pogpi回答回数373ベストアンサー獲得回数492015/06/27 06:38:17

ポイント50pt

映画、カテゴリ、順位は別テーブルにした方がいいですね。ランクの差分を順位テーブルに持たせてGROUP BY カテゴリでORDER BY 差分で取れると思います。

id:rouge_2008 No.2

rouge_2008回答回数594ベストアンサー獲得回数3512015/06/27 06:45:25

ポイント50pt

ここではテーブル名を「movies_ranking」、カラムはそれぞれ次のようにしています。

カテゴリ:Category
映画タイトル名:title
ランキング:rank
日付:Date

SELECT t2.* , CONCAT( '+', t1.rank - t2.rank ) AS rankup 
FROM  `movies_ranking` AS t1 
JOIN  `movies_ranking` AS t2 
WHERE t2.Category = t1.Category 
AND t2.title = t1.title 
AND t1.rank - t2.rank > 4 
AND t2.Date =  '2015-05-02' 
AND DATE_SUB( '2015-05-02', INTERVAL 1 DAY ) = t1.Date 
ORDER BY rankup DESC 
LIMIT 20

(※ORDER BY句を追加編集済み「ORDER BY rankup DESC」
 ※WHERE句に結合テーブルデータを日付で限定する条件追加編集済み「AND t2.Date =  '2015-05-02'」)


※急上昇の基準を5つ以上のランクアップにしていますが、3つ以上など別の基準にしたい場合は「 > 4」の数値を変更します。
※当日の日付の部分はPHPなどスクリプト側で変更してください。



【※ 追記 ※】

結合するテーブルデータの日付指定を自動で行う方法を追記します。

回答内SQLの日付指定条件の箇所を変更します。

AND t2.Date =  '2015-05-02' 
AND DATE_SUB( '2015-05-02', INTERVAL 1 DAY ) = t1.Date 

上記を以下のようにすると、それぞれ現在の日時から8時間前と1日+8時間前の日付が自動指定されます。(※午前8時に当日のランキングデータを取得できる場合の例ですので、データ更新時間が前後する場合は時間指定の部分を変更してください。)

AND DATE( DATE_SUB( NOW(), INTERVAL 8 HOUR) ) = t2.Date
AND DATE( DATE_SUB( NOW(), INTERVAL '1 8' DAY_HOUR) ) = t1.Date 

※当日午前0時すぐにデータ更新が完了している場合は、次の条件で大丈夫です。

AND CURDATE() = t2.Date
AND DATE_SUB( CURDATE(), INTERVAL 1 DAY) = t1.Date 


※DATE_SUB()の使い方は以下のページを参照してください。

・日付および時間関数
http://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_date-add

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません