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

我在
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
点赞