人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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


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


1435329490
●拡大する

●質問者: webtomake
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● POGPI
●50ポイント

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


2 ● rouge_2008
●50ポイント

ここではテーブル名を「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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ