我在
MySql 5.6.25中使用Sakila数据库.
第一个问题给了我的电影,它们按照降序为我们的“商店”提供了最高的收入.我还显示了租用的时间和租金率:
SELECT f.title, f.rental_rate, count(r.rental_id) AS "Times Rented", count(r.rental_id) * f.rental_rate as Revenue
from film f
INNER JOIN inventory i
ON f.film_id = i.film_id
INNER JOIN rental r
ON r.inventory_id = i.inventory_id
GROUP BY f.title
ORDER BY revenue DESC
第二个问题是向我们展示我们手头有多少部电影:
SELECT film.title, count(inventory.film_id)
from film
INNER JOIN inventory
ON film.film_id = inventory.film_id
group by film.title
我理解两个查询是如何工作的…独立…但是当我尝试将它们组合起来时,它们会产生意想不到的结果.请告诉我组合它们的正确方法,而不改变显示结果的方式.
最佳答案 对于那些不知道的人,mysql附带了一个很棒的练习数据库调用sakila来练习查询.
正确的方法(或类似的东西)
SELECT f.title,
f.rental_rate,
count(r.rental_id) AS "Times Rented",
count(r.rental_id) * f.rental_rate as Revenue,
(select count(*) from inventory where film_id=f.film_id) as InvCount
from film f
INNER JOIN inventory i
ON f.film_id = i.film_id
INNER JOIN rental r
ON r.inventory_id = i.inventory_id
GROUP BY f.title
ORDER BY revenue DESC
这将为您提供第一行的InvCount = 8(电影BUCKET BROTHERHOOD).
错误的做法
count(i.film_id) as InvCount
是因为别名i是由整个查询中的别名租用r的最后一次加入驱动的.
所以对于第一排产品,BUCKET BROTHERHOOD,有34个租赁和8个实际库存的项目….
如果以错误的方式执行,则显示InvCount = 34.正确答案是8.
始终对数据进行健全性检查,以防止老板对你大喊大叫.
select film_id,title from film where title like 'bucket br%'; -- film_id=103
select count(*) from inventory where film_id=103; -- count=8