【问题标题】:What Joining condition I am missing我缺少什么加入条件
【发布时间】:2019-10-31 09:57:06
【问题描述】:

我需要编写一个 SQL 查询来返回所有电影的平均评分,这些电影中的每一个都是“浪漫”而不是“喜剧”。

下面是我的表格列表-->

create table genres (genreid int,
             name text,
             primary key(genreid));

create table ratings(userid int,
           movieid int,
           rating numeric check(rating<=1 OR rating<=5),
           timestamp bigint,
            PRIMARY KEY (userid,movieid),
            FOREIGN KEY (userid) REFERENCES users (userid),
            FOREIGN KEY (movieid) REFERENCES movies (movieid));

create table hasagenre( movieid int,
               genreid int,
               FOREIGN KEY (movieid) REFERENCES movies (movieid),
               FOREIGN KEY (genreid) REFERENCES genres (genreid));

我尝试了下面的代码,但得到了错误的答案

  FROM ratings R,hasagenre H1,hasagenre H2,genres G1,genres G2
   WHERE R.movieid=H1.movieid AND H1.genreid=G1.genreid
   AND     R.movieid=H2.movieid AND H2.genreid=G2.genreid
   AND (G2.name <> 'Comedy' AND G1.name = 'Romance');

预期平均值:3.7429411764705882 实际结果:3.7458333333333333

如果我想获得所有电影的平均评分,并且每部电影都是“浪漫”和“喜剧”,那么上面的代码可以通过将 'Comedy 替换为 ='Comedy' 来正常工作

【问题讨论】:

  • 今日提示:使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 提示:GROUP BY、HAVING、COUNT()
  • 你能拥有(Romance, Terrror) 并符合平均水平吗?

标签: sql postgresql join


【解决方案1】:
SELECT avg(R.rating)
FROM ratings R
WHERE movieid IN ( SELECT movieid
                   FROM hasagenre H  
                   JOIN genres G 
                     ON H.genreid = G.genreid
                   GROUP BY movieid
                   HAVING COUNT( CASE WHEN G.name = 'Comedy' THEN 1 END) = 1
                      AND COUNT( CASE WHEN G.name = 'Romance' THEN 1 END) = 0 ) 

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 2010-10-29
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多