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子句中创建别名
。您不应该在同一个select子句中使用此别名,因为select子句的各个部分没有必须被开发的顺序Movie
- 在子查询中,使用主查询中的电影ID。子查询结果上没有聚合(例如
、MIN
等),因此这必须是主查询聚合后的唯一电影ID。还是这是MySQL?然后这就变得很奇怪了,因为MySQL允许省略聚合函数。尽管如此,这并不能解释不同的结果SUM
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;
此代码适用于表示加号或减号排名的列的任何值。
请看。
哦,看来我的回答迟到了:-)