如何将这两个SQL查询合并到一个查询中?

时间:2015-07-18 23:11:25

标签: mysql join group-by inner-join

我在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 个答案:

答案 0 :(得分:2)

对于那些不知道的人来说,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