0

我有三张桌子:

    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 查询,它从最常见的流派中为我提供最常见的电影(带有电影路径、标题)。

有任何想法吗?

更新

结果:

| MID |   TITLE    | MOVIEPATH |
--------------------------------
|   4 | Happy days |         a |
|   4 | Happy days |         a |
4

4 回答 4

2

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

SQLFIDDLE 演示

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

结果:

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

您可以使用此替代方法,因为 HSQL 不支持dense_rank

查询:order by desc and top 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
;
于 2013-01-12T12:09:35.750 回答
1

您可以通过在子查询中对电影的所有评分求和来计算评分。另一个子查询可以计算每种类型的最高评分。通过将它们连接在一起,您将只过滤每种类型的热门电影:

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
于 2013-01-12T11:29:40.570 回答
0

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

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.

但是,如果您要从最常见的流派中寻找最常见的电影,您必须在表格中了解每部电影和每种流派的观看次数。

于 2013-01-12T11:29:26.410 回答
0

我可以建议您在评分上使用聚合最大值以及在流派上分组

select max(Rating.rating) as max_rating, Genre.genre, Movie.movieId from Movie inner join Rating on Movie.movieId = Rating.mid inner join Genre on Movie.movieId = Genre.movieId group by Genre.genre;

我不太确定这是否会 100% 有效,因为我没有尝试过,但我的想法是使用 group by。它可以与 count、max、min、avg 等聚合一起使用。

我希望这会有所帮助

于 2013-01-12T11:49:47.550 回答