mysql - 萨基拉 BD 练习

标签 mysql sql join

我正在尝试在 Sakila 数据库中开发 SQL (MySQL) 功能。我对以下问题有疑问:每个类别和每年的平均电影租赁时间是多少?

这是我到目前为止的查询:

select avg(r.return_date - r.rental_date) as avgDate, c.name
from 
    rental r, category c
    inner join inventory i
        on i.inventory_id = r.inventory_id 
    inner join film f
        on f.film_id=i.film_id 
group by c.name
order by avgDate desc;

错误如下:

Error Code: 1054. Unknown column 'r.inventory_id' in 'on clause'.

我知道今年的部分仍然缺失,但我正在努力解决这个问题。有人可以帮助我吗?

谢谢!!

最佳答案

不要混合隐式连接和显式连接。显式连接比隐式连接具有更高的优先级,因此首先对它们进行评估,这会导致您收到错误。事实上,始终使用显式连接。

此外,您还需要引入 junction table film_category将电影与类别联系起来。

这是您的新 from 子句:

from 
    rental r
    inner join inventory i on i.inventory_id = r.inventory_id 
    inner join film f on f.film_id = i.film_id
    inner join film_category fc on fc.fim_id = f.fim_id
    inner join category c on c.category_id = fc.category_id

查询中的另一个问题是日期算术。 MySQL 中不能将两个日期相减。您可以使用 timestampdiff() 来实现此目的。假设您想要以分钟为单位的日期之间的差异,则:timestampdiff(month, r.rental_date, r.return_date)

您的最终查询:

select 
    c.name, 
    avg(timestampdiff(minute, r.rental_date, r.return_date)) avg_rental_duration
from 
    rental r
    inner join inventory i on i.inventory_id = r.inventory_id 
    inner join film f on f.film_id = i.film_id
    inner join film_category fc on fc.fim_id = f.fim_id
    inner join category c on c.category_id = fc.category_id
group by c.category_id, c.name

关于mysql - 萨基拉 BD 练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59276452/

相关文章:

mysql - 使用 INSERT SELECT 和 VALUES 插入 MYSQL 数据库

mysql - SQL查询错误

sql - 更新SQL DB的更好方法

c# - 从 C# Winforms 更新表不工作

php - 如何在 PHP 中验证 MYSQL 日期?

mysql - 刷新表 - 访问被拒绝

python - 使用 pyodbc 和 SQL Server 的 SQL IN 运算符

mysql - 当列上存在键时,为什么索引不用于 Group by 和/或 Join

performance - 在表之间进行连接时,决定表顺序的因素是什么?

php - 如何从 mysql 连接结果中删除匹配行并显示不匹配行?