SQL-按类型获得最高评级的电影

SQL-按类型获得最高评级的电影,sql,database,hsqldb,Sql,Database,Hsqldb,我有三张桌子: CREATE TABLE Movie ( movieId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, title VARCHAR(255) NOT NULL, moviePath VARCHAR(500) NOT NULL ); CREATE TABLE Rating ( rid INTEGER GENERATE

我有三张桌子:

    CREATE TABLE Movie
    (
        movieId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
        title VARCHAR(255) NOT NULL,
        moviePath VARCHAR(500) NOT NULL
    );

    CREATE TABLE Rating
    (
        rid INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
        mid INTEGER FOREIGN KEY REFERENCES Movie(movieId) ON DELETE CASCADE, 
        uid INTEGER FOREIGN KEY REFERENCES User(id) ON DELETE CASCADE,
        rating INTEGER NOT NULL, 
    );

   CREATE TABLE Genre(
       id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
       movieId INTEGER NOT NULL FOREIGN KEY REFERENCES Movie(movieId) ON DELETE CASCADE,
       genre VARCHAR(255) NOT NULL
   );
我想创建一个sql查询,从最常看的类型返回最常看的电影(带有moviepath、title)

有什么想法吗

更新

结果:

| MID |   TITLE    | MOVIEPATH |
--------------------------------
|   4 | Happy days |         a |
|   4 | Happy days |         a |
| MID | SUM_RATING |      TITLE | MOVIEPATH | GENRES |
------------------------------------------------------
|   4 |         37 | Happy days |         a | comedy |
|   4 |         37 | Happy days |         a | RomCom |

我们在哪里可以找到视图计数?使用此表,您可以使用以下查询查找最高评级的电影:

select Movie.movieId, Movie.title, Movie.moviepath
from movie, rating, genre
where
    movie.id = rating.mid and
    movie.id = genre.movieId
order by rating desc
limit 1; // limit is used if you are using MySQL. In other databases you can use suitable sql query.

但是,如果您要从最受欢迎的电影类型中寻找最受欢迎的电影,则必须在表中列出每部电影和每种类型的观看次数。

在哪里可以找到观看次数?使用此表,您可以使用以下查询查找最高评级的电影:

select Movie.movieId, Movie.title, Movie.moviepath
from movie, rating, genre
where
    movie.id = rating.mid and
    movie.id = genre.movieId
order by rating desc
limit 1; // limit is used if you are using MySQL. In other databases you can use suitable sql query.

但是,如果您要从最常看的电影类型中查找最常看的电影,则必须在表中列出每部电影和每种类型的观看次数。

您可以通过在子查询中求和一部电影的所有评分来计算评分。另一个子查询可以计算每个流派的最高评分。通过将它们结合在一起,您将只筛选每种类型的顶级电影:

select  *
from    Movie m
join    Genre g
on      g.movieId = m.movieId
join    (
        select  r.mid
        ,       sum(Rating) as SumRating
        from    Rating r
        group by
                r.mid
        ) r
on      r.mid = m.movieId
join    (
        select  g.id as gid
        ,       max(SumRating) as MaxGenreRating
        from    (
                select  r.mid
                ,       sum(Rating) as SumRating
                from    Rating r
                group by
                        r.mid
                ) r
        join    Genre g
        on      g.movieId = r.mid
        group by
                g.id
        ) filter
on      filter.gid = g.id
        and filter.MaxGenreRating = r.SumRating

您可以通过将子查询中某部电影的所有分级相加来计算分级。另一个子查询可以计算每个流派的最高评分。通过将它们结合在一起,您将只筛选每种类型的顶级电影:

select  *
from    Movie m
join    Genre g
on      g.movieId = m.movieId
join    (
        select  r.mid
        ,       sum(Rating) as SumRating
        from    Rating r
        group by
                r.mid
        ) r
on      r.mid = m.movieId
join    (
        select  g.id as gid
        ,       max(SumRating) as MaxGenreRating
        from    (
                select  r.mid
                ,       sum(Rating) as SumRating
                from    Rating r
                group by
                        r.mid
                ) r
        join    Genre g
        on      g.movieId = r.mid
        group by
                g.id
        ) filter
on      filter.gid = g.id
        and filter.MaxGenreRating = r.SumRating

我建议您在评级中使用聚合最大值,并在流派中使用分组


选择max(Rating.Rating)作为电影中的max_Rating、流派.流派、电影.电影ID
Movie.movieId=Rating.mid上的内部联接分级
Movie.movieId=Genre.movieId上的内部连接类型
按体裁分组;

我不太确定这是否100%有效,因为我没有尝试过,但我的想法是使用分组方式。它可以与计数、最大值、最小值、平均值等集合一起使用


我希望这会有所帮助

我可以建议您在评级中使用聚合最大值,并在流派中使用分组


选择max(Rating.Rating)作为电影中的max_Rating、流派.流派、电影.电影ID
Movie.movieId=Rating.mid上的内部联接分级
Movie.movieId=Genre.movieId上的内部连接类型
按体裁分组;

我不太确定这是否100%有效,因为我没有尝试过,但我的想法是使用分组方式。它可以与计数、最大值、最小值、平均值等集合一起使用


我希望这会有所帮助

如果您提供了一些匹配的样本数据,那就太好了。。我们试试这个。看看你先前的问题,这个答案是草拟的

结果:

| MID |   TITLE    | MOVIEPATH |
--------------------------------
|   4 | Happy days |         a |
|   4 | Happy days |         a |
| MID | SUM_RATING |      TITLE | MOVIEPATH | GENRES |
------------------------------------------------------
|   4 |         37 | Happy days |         a | comedy |
|   4 |         37 | Happy days |         a | RomCom |
您可以使用此选项,因为HSQL不支持
densite\u-rank

查询时使用:
按描述和前1名排序的订单

-- alternatively

select t.mid, t.sum_rating,
m.title, m.moviepath, g.genres
from (
  select top 1 mid, 
         sum(rating) as sum_rating
  from rating
  group by mid
  order by sum_rating desc
) t
left join movie m
on m.movieid = t.mid
left join genre g
on g.movieid = m.movieid
;

如果您提供了一些匹配的示例数据,那就太好了。。我们试试这个。看看你先前的问题,这个答案是草拟的

结果:

| MID |   TITLE    | MOVIEPATH |
--------------------------------
|   4 | Happy days |         a |
|   4 | Happy days |         a |
| MID | SUM_RATING |      TITLE | MOVIEPATH | GENRES |
------------------------------------------------------
|   4 |         37 | Happy days |         a | comedy |
|   4 |         37 | Happy days |         a | RomCom |
您可以使用此选项,因为HSQL不支持
densite\u-rank

查询时使用:
按描述和前1名排序的订单

-- alternatively

select t.mid, t.sum_rating,
m.title, m.moviepath, g.genres
from (
  select top 1 mid, 
         sum(rating) as sum_rating
  from rating
  group by mid
  order by sum_rating desc
) t
left join movie m
on m.movieid = t.mid
left join genre g
on g.movieid = m.movieid
;

我认为
movieId
不应该在
Genre
表中,而
GenreId
应该在
Movie
表中。对于这样的查询,您的表不完整,您需要一些其他详细信息。在当前表中,每种类型都可以有一部电影,但在我告诉的表中,每部电影都有一种类型。@MahdiTahsildari一部电影可以有多个类型,这是真的吗?我在向OP的表格中添加样本数据时考虑到了这一点,因为这是一种没有样本数据的盲目猜测。我认为
movieId
不应该在
Genre
表格中,而
GenreId
应该在
Movie
表格中。对于这样的查询,您的表不完整,您需要一些其他详细信息。在当前表中,每种类型都可以有一部电影,但在我告诉的表中,每部电影都有一种类型。@MahdiTahsildari一部电影可以有多个类型,这是真的吗?我在向OP的表中添加样本数据时考虑到了这一点,因为它是没有样本数据的盲猜测。hsql不支持稠密的_rank()。有没有一个没有稠密等级的可能解决方案?@maximus这就是你需要的吗)我是指预期的结果)?请澄清,注意我使用的样本数据,如果您需要对样本数据和表结构进行任何更改,请发表评论。如果是这样的话,我们也可以用其他方法来实现HSQL。我只需要mid,标题,moviepath@maximus我已经用另一种方法更新了。请看一看。另外,请确认一部电影在您的设计中是否可以有多个流派,以确保我们的理智:)因此我们知道我们遵循的表架构是正确的。@maximus您只需从
select子句
中删除
genres
列,以确保获得预期结果,并将
distinct
添加到
select子句中即可claues
因为您不想两次返回同一数据行..hsql不支持稠密_rank()。有没有一个没有稠密等级的可能解决方案?@maximus这就是你需要的吗)我是指预期的结果)?请澄清,注意我使用的样本数据,如果您需要对样本数据和表结构进行任何更改,请发表评论。如果是这样的话,我们也可以用其他方法来实现HSQL。我只需要mid,标题,moviepath@maximus我已经用另一种方法更新了。请看一看。另外,请确认一部电影在您的设计中是否可以有多个流派,以确保我们的理智:)因此我们知道我们遵循的表架构是正确的。@maximus您只需从
select子句
中删除
genres
列,以确保获得预期结果,并将
distinct
添加到
select子句中即可claues
因为您不想两次返回同一数据行。。