2016-04-02 18 views
0

私は、最長の映画レンタル期間と上記の映画を借りた顧客(および映画)をSakilaデータベースに保存します。"最長の映画レンタル期間とその映画をレンタルした顧客" MySQL Sakilaのクエリ

最初のステップとして、私はfilm_id、inventory_id、CUSTOMER_IDと(週単位)レンタルの最長期間を返すことになっている次のクエリ、書いている:私はまだ

SELECT DDIFF.* 

FROM (SELECT rental.inventory_id, rental.customer_id, DATEDIFF(rental.return_date, rental.rental_date)/7 AS TM FROM rental) AS DDIFF 

INNER JOIN (SELECT DDIFF.inventory_id, DDIFF.customer_id, MAX(DDIFF.TM) AS WEEKS 
FROM (SELECT rental.inventory_id, rental.customer_id, DATEDIFF(rental.return_date, rental.rental_date)/7 AS TM FROM rental) AS DDIFF 
GROUP BY DDIFF.inventory_id, DDIFF.customer_id) AS MXLST 

ON DDIFF.TM = MXLST.WEEKS AND MXLST.inventory_id = DDIFF.inventory_id AND MXLST.customer_id = DDIFF.customer_id 

; 

をいくつかの予期しない結果が出ています(それは複数のの行を最長で1.4286週間返すはずですが、何らかの理由で1.0週間を取得しています)。私は間違って何をしていますか?私は説明を聞いてとても感謝しています。

thisthisを正しく試してみましたが、まだ正しい結果を返さないことに注意してください。

編集:てSakilaのtables`構造を見つけることができますhere

+0

テーブルの構造を追加してください。 –

+0

@juergend done、私の編集を参照してください。 – Kyle

+0

あなたのSQLは私の心よりも進んでいるので、結果は最も近い整数に丸められているか、または結果が整数のみを必要とする列/変数に書き込まれていると推測しています。 –

答えて

1

あなたのクエリは非常に非効率的である:あなたは完全なテーブルや、他の操作に3 SELECT秒を行っています。私はあなたのクエリをテストしました。何も結果を出すことなく60秒以上実行されています。ちょうどそれを殺して、次のようにクエリを書き直しました:

SELECT c.first_name, c.last_name, f.title, DATEDIFF(r.return_date,r.rental_date)/7 AS rental_time 
FROM rental AS r 
INNER JOIN inventory AS i 
ON r.inventory_id = i.inventory_id 
INNER JOIN film AS f 
ON i.film_id = f.film_id 
INNER JOIN customer AS c 
ON r.customer_id = c.customer_id 
HAVING rental_time = (SELECT MAX(DATEDIFF(return_date,rental_date))/7 FROM rental) 
+0

あなたの質問を正しく解釈していない可能性があります。レンタル期間を週単位で計算し、その時間帯にすべてのレンタルを選択したいとしますか? – Reversal

+0

私は、週に一番長い時間、映画を借りた人の名前、彼らが借りた映画のタイトル、そして彼らがそれを借りた時間(週には1.4286週これらすべての人々のために)。 – Kyle

+0

更新:自分自身を考え出し、答えを投稿しました。少なくともお試しいただきありがとうございます:) – Kyle

0

私は自分自身の質問を解決することができたようです。ここでは、今後の参考のために更新クエリです:

SELECT customer.first_name, 
     customer.last_name, 
     film.title, 
     DDIFF.TM AS 'rental duration' 
FROM customer, 
    film, 
    (SELECT inventory.film_id, 
      rental.inventory_id, 
      rental.customer_id, 
      DATEDIFF(rental.return_date, rental.rental_date)/7 AS TM 
     FROM rental, 
      inventory 
     WHERE rental.inventory_id = inventory.inventory_id) AS DDIFF 

INNER JOIN (SELECT DDIFF.film_id, 
       DDIFF.inventory_id, 
       DDIFF.customer_id, 
       MAX(DDIFF.TM) AS WEEKS 
      FROM (SELECT inventory.film_id, 
         rental.inventory_id, 
         rental.customer_id, 
         DATEDIFF(rental.return_date, rental.rental_date)/7 AS TM 
        FROM rental, 
         inventory 
        WHERE rental.inventory_id = inventory.inventory_id) AS DDIFF 
      GROUP BY DDIFF.film_id, 
        DDIFF.inventory_id, 
        DDIFF.customer_id) AS MXLST 
ON DDIFF.TM = (SELECT MAX(DDIFF.TM) 
       FROM (SELECT inventory.film_id, 
          rental.inventory_id, 
          rental.customer_id, 
          DATEDIFF(rental.return_date, rental.rental_date)/7 AS TM 
         FROM rental, 
          inventory 
         WHERE rental.inventory_id = inventory.inventory_id) AS DDIFF) 
AND MXLST.film_id = DDIFF.film_id 
AND MXLST.inventory_id = DDIFF.inventory_id 
AND MXLST.customer_id = DDIFF.customer_id 

WHERE customer.customer_id = DDIFF.customer_id 
AND film.film_id = DDIFF.film_id; 

は私が認める、それは効率的ではありませんもまともに見えますが、それが正しい答えです。誰でも同じ結果を返すより効率的な/読みやすいクエリを試してみることを歓迎します。とにかく、助けようとしたみんなに感謝します。

関連する問題