如何将这两个 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 查询组合成一个查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取两个 sql 查询并将它们组合成一个查询

如何获取两个SQL查询并将它们组合成一个查询

组合 SQL 查询 [重复]

将多个子查询组合成一个查询

如何将 4 个 sql 查询组合成一个性能良好的查询?

将两个 SQL 查询的结果组合为单独的列