2017-02-09 54 views
3

试图根据样本表中不同的标准对计数进行简单的划分,并根据影片评级进行分组。我正在使用默认使用的MySQL示例SAKILA模式。需要左连接吗? WHERE条件的行为与INNER JOIN相似

你可以看到不同的罪名,我期待从这些前两个查询看到:

第一个查询:

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的划分,等等。

我希望以下查询能够完成这个计算,但是对于我来说,LEFT JOIN看起来像是一个INNER JOIN,因为这两个WHERE条件只导致1个包含'BA'以及'AM ”,这就是为什么结果是什么,它是:

疑难QUERY:

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?

在此先感谢。

回答

3

可以使用条件聚集在这里:

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 

注意,目前做的方法自连接,我认为在错误的方向前进。相反,我们可以对整个表进行一次扫描,并为每个rating组计算各种标题。

+0

伟大工程算,感谢这么多的快速响应及解释 –

+0

嗨西德尼,请开启一个新问题,而不是粘贴在这里作为评论。 –

+0

这是,谢谢: http://stackoverflow.com/questions/42130476/calculating-acceptance-ratio-with-left-join-and-self-join-and-aggregate-function –

1

您不需要任何连接。

SELECT 
    rating, 
    count(if (title like '%BA%', 1, null))/count(if (title like '%AM%', 1, null)) 
FROM sakila.film 
GROUP BY 1 
ORDER BY 1 

组由1 /顺序由1表示在选择

数第一列将不会在任何空值

+0

很好,谢谢你快速的回应 –