0

私は3つのテーブルを持っています:

    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
   );

最も見られたジャンルから最も見られた映画 (moviepath、タイトル付き) を返す 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 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 に答える
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 に答える