2

データベースに 2 つのテーブルがあり、1 つのクエリを使用して特定のレポートの両方からデータを取得しようとしています。

表 1 は「映画」で、次のフィールドがあります。

  • 映画_ID
  • 名前
  • シーズン

表 2 は、各映画の「興行収入」です。

  • ボックスオフィス_ID
  • 映画_ID
  • 日にち

特定のシーズンの各映画の公開週末を比較するクエリを実行し、収集された金額を合計した 1 つのデータセットとしてそれらを返したいと考えています。各映画を取得し、各映画の最初の 3 日間の興行収入を取得し、それらを合計して、次のようなクエリが返されるようにします。

  1. 映画A、4910万
  2. 映画B、4220万
  3. ムービー C、2950 万

収集された金額は数値を出力するだけでよいことに注意してください。書式設定は私が行います。各映画の興行収入の最初の 3 日間のみをクエリして、それらを合計する方法を理解するのに苦労しています。

1 つのクエリを実行して興行収入で映画を取得し、それをループしてデータベースを再クエリできることはわかっていますが、多くの映画では最も効率的な方法ではないこともわかっています。このすべて (各映画の最初の 3 日間を合計したもの) を 1 つのクエリで実行する方法があるかどうかはわかりませんが、より高度な知識を持つ人が私を助けてくれるかどうかを確認したかったのです。

4

2 に答える 2

1
SELECT  a.Name, SUM(COALESCE(b.Amount,0)) totalAmount
FROM    Movies a
        LEFT JOIN BoxOffice b
            ON a.Movies_ID = b.Movies_ID
WHERE   b.date BETWEEN DATE_ADD(CURDATE(),INTERVAL -3 DAY) AND CURDATE()
GROUP BY a.Name

の値CURDATE()が 2012-11-06 (今日) の場合、 2012-11-03から2012-11-06まで計算されます。

フォローアップの質問、どのように日付を計算しますか? 日ごとに?週ごと?または何?

更新 1

SELECT  a.Name, SUM(COALESCE(b.Amount,0)) totalAmount
FROM    Movies a
        LEFT JOIN BoxOffice b
            ON a.Movies_ID = b.Movies_ID
        LEFT JOIN
        (
            SELECT  movies_ID, MIN(date) minDate
            FROM    BoxOffice
            GROUP BY Movies_ID
        ) c ON a.Movies_ID = c.Movies_ID
WHERE   DATE(b.date) BETWEEN DATE(c.minDate) AND 
                             DATE(DATE_ADD(c.minDate,INTERVAL 3 DAY))
GROUP BY a.Name
于 2012-11-06T00:19:51.987 に答える
0

Movies_ID でテーブルを結合し、発行日と日付の間の TIMEDIFF を 3 日として WHERE を追加するだけです。

于 2012-11-06T00:20:34.110 に答える