如何将这两个 SQL 查询组合成一个查询?
Posted
技术标签:
【中文标题】如何将这两个 SQL 查询组合成一个查询?【英文标题】:How can I combine these two SQL queries into a single query? 【发布时间】:2015-10-08 09:24:37 【问题描述】:我在 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
我了解这两个查询是如何工作的......独立......但是当我尝试将它们组合起来时,它们会产生意想不到的结果。请告诉我在不改变结果显示方式的情况下将它们组合的正确方法。
【问题讨论】:
【参考方案1】:对于那些不知道的人,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
是因为alias i
是由它在整个查询中对别名rental 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
【讨论】:
以上是关于如何将这两个 SQL 查询组合成一个查询?的主要内容,如果未能解决你的问题,请参考以下文章