我在创建一些查询时遇到问题。
我正在使用Sakila DB。我正在尝试使用“ count ((datediff (rental.rental_date, rental.return_date))> film.rental_duration as n”创建每个客户端的延迟数的新列...

其中电影放映延迟最多的前十名客户。

Select customer.first_name, customer.last_name, count ((datediff (rental.rental_date, rental.return_date))> film.rental_duration as nTime
From customer,film,rental,inventory
Where customer.customer_id=rental.customer_id
and rental.inventory_id=inventory.inventory_id
and (datediff (rental.rental_date,rental.return_date)) > film.rental_duration
limit 10;


我究竟做错了什么?

谢谢!!

最佳答案

我做了一些假设,但这应该与您想要的非常接近:

select c.customer_id, count(*)
from
    customer c
    inner join rental r
        on r.customer_id = c.customer_id
    inner join film f
        on f.film_id = r.film_id
        and (datediff (r.rental_date, r.return_date)) > f.rental_duration
group by c.customer_id
order by count(*) desc
limit 10;


查询问题:


它缺少聚合;您需要按客户对记录进行分组,以便可以计算每个客户发生了多少延迟租金回报
它缺少film表的连接条件;我假设film通过列rentalfilm_id相关
如果您使用标准的显式联接而不是老式的隐式联接,则以前的问题将更容易发现。这是为什么您应该始终使用标准联接的众多原因之一
正如Thorsten Kettner所评论的,此查询中inventory表似乎是多余的:其他3个表包含您需要的所有信息

关于mysql - SQL查询-Sakila BD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59226077/

10-11 05:25