首页 > 解决方案 > 如何计算一个值在 Where 之后的列数?

问题描述

我需要执行一个查询,我必须在其中显示电影的标题以及获得超过 2000 票的前 5 部评分最高的电影的平均估值。

要执行该查询,我从下表中处理(已导入值):

DROP TABLE IF EXISTS Film CASCADE;
CREATE TABLE Film(
  id_film INT,
  title VARCHAR(255),
  year INT,
  PRIMARY KEY(id_film)
);

DROP TABLE IF EXISTS User CASCADE;
CREATE TABLE User (
  id_user INT,
  gender VARCHAR(255),
  postal_code VARCHAR(255),
  id_ocupation INT, 
  PRIMARY KEY(id_user),
  FOREIGN KEY(id_ocupation) REFERENCES Ocupation(id_ocupation),
);

DROP TABLE IF EXISTS User_Film;
CREATE TABLE User_Film (
  id_film INT, 
  id_user INT, 
  rating INT,
  timestamp INT,
  PRIMARY KEY(id_film, id_user),
  FOREIGN KEY (id_film) REFERENCES Film(id_film),
  FOREIGN KEY (id_user) REFERENCES User(id_user)
);

我已经尝试执行以下查询。查询工作正常,但是,我怎样才能按 valorations 的数量过滤输出?

select title, avg(rating)
from User U,
     Film P,
     User_Film UP
where UP.id_user = U.id_user
  AND UP.id_film = P.id_film
group by title
order by avg(rating) desc
limit 5;

我还猜测(因为在任何名为 number_of_valorations 或类似名称的表中都没有字段),valorations 的数量是对同一部电影进行评分的用户数量。

标签: sqlpostgresqlselect

解决方案


你想要一个having子句:

select title, avg(rating)
from User U join
     User_Film UP
     on UP.id_user = U.id_user join
     Film P 
     on UP.id_film = P.id_film
group by title
having count(*) >= 2000
order by avg(rating) desc
limit 5;

学习使用正确、明确、标准 JOIN的语法。 切勿FROM子句中使用逗号。


推荐阅读