SQL视图-结果与选择不同

问题描述 投票:0回答:1

我有这样的表users_movies

ID (100 records)|movie_id |ranks ( 0 or 1)
1|3|0
2|2|0
3|2|1
4|3|0
5|1|1
6|2|0
etc.

我的SQL是:

SELECT
        movie_id as Movie,
        (SELECT COUNT(ranks) 
        FROM users_movies
        WHERE ranks = 1 and movie_id = Movie) as plus,

        (SELECT COUNT(ranks)
        FROM users_movies
        WHERE ranks = 0 and movie_id = Movie)as minus 
    FROM users_movies
    GROUP BY movie_id
    ORDER BY movie_id

结果表如预期:

Movie|plus|minus
1|5|2
2|3|3
3|0|10
etc.

但是当我想创建视图时:

CREATE VIEW v1 as /*the only line I add */
SELECT
        movie_id as Movie,
        (SELECT COUNT(ranks) 
        FROM users_movies
        WHERE ranks = 1 and movie_id = Movie) as plus,

        (SELECT COUNT(ranks)
        FROM users_movies
        WHERE ranks = 0 and movie_id = Movie)as minus 
    FROM users_movies
    GROUP BY movie_id
    ORDER BY movie_id

结果完全不同:

Movie|plus|minus
1|45|55
2|45|55
3|45|55
etc.

什么原因造成的,我该如何解决?

sql view
1个回答
0
投票

您的原始查询混合了似乎没有正确关联的聚合和子查询。

您可以通过条件聚合来简化它:

create view v1 as
select
    movie_id,
    sum(ranks) plus,
    count(*) - sum(ranks) minus 
from users_movies
group by movie_id

这是有效的,因为ranks为0或1,所以sum(ranks)给出了rank = 1的记录数,而count(*) - sum(ranks)给出了0的计数。

© www.soinside.com 2019 - 2024. All rights reserved.