SQL视图-结果与选择不同

SQL视图-结果与选择不同,sql,group-by,sum,pivot,sql-view,Sql,Group By,Sum,Pivot,Sql View,我得到了如下表格users\u movies: ID (100 records) | movie_id | ranks ( 0 or 1) -----------------+----------+---------------- 1 | 3 | 0 2 | 2 | 0 3 | 2 | 1 4 | 3 |

我得到了如下表格
users\u 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.
create view v1 as
select
    movie_id,
    sum(case when ranks = 'good' then 1 else 0 end) good,
    sum(case when ranks = 'bad' then 1 else 0 end) bad 
from users_movies
group by movie_id

这是什么原因造成的?我如何解决这一问题?

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

您可以使用条件聚合对其进行简化:

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的计数

如果值不是0和1,则该技术是不同的:

Movie | plus | minus
------+------+------
  1   |  45  |  55
  2   |  45  |  55
  3   |  45  |  55
  etc.
create view v1 as
select
    movie_id,
    sum(case when ranks = 'good' then 1 else 0 end) good,
    sum(case when ranks = 'bad' then 1 else 0 end) bad 
from users_movies
group by movie_id

我不知道到底发生了什么。我看到两件事:

  • 您正在select子句中创建别名
    Movie
    。您不应该在同一个select子句中使用此别名,因为select子句的各个部分没有必须被开发的顺序
  • 在子查询中,使用主查询中的电影ID。子查询结果上没有聚合(例如
    MIN
    SUM
    等),因此这必须是主查询聚合后的唯一电影ID。还是这是MySQL?然后这就变得很奇怪了,因为MySQL允许省略聚合函数。尽管如此,这并不能解释不同的结果
毕竟,你只想要这个:

CREATE VIEW v1 AS
SELECT
  movie_id,
  SUM(ranks) as plus,
  COUNT(*) - SUM(ranks) as minus
FROM users_movies
GROUP BY movie_id;

如果在相关子查询中为表添加别名并使用限定列名,则会得到正确的结果:

CREATE VIEW v1 AS    
SELECT
        um.movie_id as Movie,
        (SELECT COUNT(ranks) 
        FROM users_movies
        WHERE ranks = 1 and movie_id = um.movie_id) as plus,
        (SELECT COUNT(ranks)
        FROM users_movies
        WHERE ranks = 0 and movie_id = um.movie_id) as minus 
FROM users_movies um
GROUP BY um.movie_id
ORDER BY um.movie_id;  
请参阅。
当然,有更好的方法可以通过条件聚合满足您的需求,MySql提供了简单易读的解决方案,如:

CREATE VIEW v1 AS
SELECT
    movie_id,
    SUM(ranks = 1) plus,
    SUM(ranks = 0) minus 
FROM users_movies
GROUP BY movie_id;
此代码适用于表示加号或减号排名的
列的任何值。

请看。

哦,看来我的回答迟到了:-)