【问题标题】:"longest film rental duration and the customer who rented the said film" MySQL Sakila query“最长的影片租借时间和租借该影片的客户” MySQL Sakila 查询
【发布时间】:2016-07-22 04:27:13
【问题描述】:

我正在尝试编写一个查询,该查询将返回 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

;

但我得到了一些意想不到的结果(它应该返回 multiple 行,最长持续时间为 1.4286 周,但由于某种原因我得到了 1.0 周)。我究竟做错了什么?如果能听到解释,我将不胜感激。

请注意,我已尝试按照 thisthis 正确使用 MAX() 但它仍然没有返回正确的结果。

编辑:Sakila 表的结构可以在here找到

【问题讨论】:

  • 请添加表格结构
  • @juergend 完成,查看我的编辑。
  • 你的 SQL 比我想象的更高级,所以我推测原因是 1)结果被四舍五入到最接近的整数或 2)结果被写入期望整数的列/变量仅限。
  • @fiprojects 我不认为是这样,因为我发现结果列表中不应该出现的人的名字。尽管如此,还是感谢您的意见。

标签: mysql


【解决方案1】:

似乎我已经设法解决了我自己的问题。这是一个更新的查询以供将来参考:

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;

我承认,它效率不高,看起来也不像样,但这是一个正确的答案。欢迎任何人尝试找到返回相同结果的更有效/可读性更高的查询。无论如何,感谢所有试图提供帮助的人。

【讨论】:

    【解决方案2】:

    您的查询非常低效:您正在对完整表执行 3 SELECTs,然后执行其他操作。我测试了你的查询:它已经运行了 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)
    

    【讨论】:

    • 也许我没有正确解释你的问题。您想计算以周为单位的最长租赁时间,然后选择具有此时间的每次租赁?
    • 我想返回在几周内租用电影时间最长的人的全名、他们租用的电影的名称以及他们租用的时间(以周为单位) - 对于所有这些人来说,这恰好是 1.4286 周)。
    • 更新:我自己弄清楚并发布了答案。感谢您至少尝试:)
    • 非常好的答案!比我贴的更易读!点赞并选为最佳答案,谢谢!
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2021-09-24
    相关资源
    最近更新 更多