【问题标题】:How can I combine these two SQL queries into a single query?如何将这两个 SQL 查询组合成一个查询?
【发布时间】: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

我了解这两个查询是如何工作的......独立......但是当我尝试将它们组合起来时,它们会产生意想不到的结果。请告诉我在不改变结果显示方式的情况下将它们组合的正确方法。

【问题讨论】:

    标签: mysql join group-by inner-join


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 2017-09-02
      • 2019-02-16
      • 2020-07-08
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多