数据库
首页 > 数据库> > MySQL的-需要左联接?条件的行为与INNER JOIN相似

MySQL的-需要左联接?条件的行为与INNER JOIN相似

作者:互联网

尝试根据与样本表不同的标准对计数进行简单划分,并按电影等级分组.我正在使用MySQL默认提供的示例SAKILA模式.

您可以从前两个查询中看到我希望看到的单独计数:

第一查询:

SELECT f1.rating, count(f1.title)
FROM sakila.film f1
WHERE f1.title like '%BA%'
GROUP BY rating
ORDER BY rating ASC

第一查询结果:

    rating  count(f1.title)
    G       4
    PG      5
    PG-13   8
    R       6
    NC-17   6

第二查询:

SELECT f1.rating, count(f1.title)
FROM sakila.film f1
WHERE f1.title like '%AM%'
GROUP BY rating
ORDER BY rating ASC

第二查询结果:

    rating  count(f1.title)
    G       8
    PG      6
    PG-13   9
    R       18
    NC-17   7

我所追求的是G等级的得分为4/8,PG等级的得分为5/6,依此类推.

我曾希望以下查询能够完成此计算,但是对我而言,左联接似乎充当了内部联接,因为这两个WHERE条件只会导致一部电影同时包含“ BA”和“ AM”,这是结果为何如此:

问题查询:

SELECT f1.rating, count(f1.title)/count(f2.title) 
FROM sakila.film f1
LEFT JOIN sakila.film f2
ON f1.film_id = f2.film_id
WHERE f1.title like '%BA%'
AND f2.title like '%AM%'
GROUP BY rating
ORDER BY rating ASC

问题查询结果:

    rating  count(f1.title)/count(f2.title) 
    PG-13   1.0000

如何修改有问题的查询,以按预期方式将前两个查询的计数除以期望值并按等级分组?我是否需要使用UNION ALL重写查询,还是在这种情况下仍可以使用LEFT JOIN?

提前致谢.

解决方法:

您可以在此处使用条件聚合:

SELECT rating,
       SUM(CASE WHEN title LIKE '%BA%' THEN 1 ELSE 0 END) /
       SUM(CASE WHEN title LIKE '%AM%' THEN 1 ELSE 0 END) AS the_ratio
FROM sakila.film
GROUP BY rating
ORDER BY rating ASC

请注意,我认为您当前进行自我加入的方法的方向错误.取而代之的是,我们可以对整个表格进行一次扫描,并为每个评分组计算各种标题.

标签:self-join,left-join,mysql
来源: https://codeday.me/bug/20191026/1935147.html