我有这样的表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.
什么原因造成的,我该如何解决?
您的原始查询混合了似乎没有正确关联的聚合和子查询。
您可以通过条件聚合来简化它:
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的计数。