1

次の2つのテーブルがあります。

1.映画の詳細(映画ID、映画名、評価、投票、年)

2.映画のジャンル (Movie-ID,Genre)

次のクエリを使用して結合を実行し、各ジャンルで最高の評価の映画を取得しています。

select Movie_Name, 
    max(Rating) as Rating,
    Genre from movie_test 
inner join movie_genre 
where movie_test.Movie_ID = movie_genre.Movie_ID 
group by Genre

出力の Rating と Genre は正しいですが、Movie_Name が正しくありません。

レーティングとジャンルとともに正しい映画名を取得するためにどのような変更を加える必要があるかを誰でも提案できますか?

4

3 に答える 3

3
SELECT  g.*, d.*
FROM    MovieGenre g
        INNER JOIN MovieDetail d
            ON g.MovieID = d.MovieID
        INNER JOIN
        (
            SELECT  a.Genre, MAX(b.Rating) maxRating
            FROM    MovieGenre a
                    INNER JOIN MovieDetail b
                        ON a.MovieID = b.MovieID
            GROUP   BY a.Genre
        ) sub ON    g.Genre = sub.Genre AND
                    d.rating = sub.maxRating

スキーマの設計に問題があります。Movieが多数を持てるGenreだけでなく、多数をGenre含むことができる場合、Movieそれは 3 つのテーブルの設計である必要があります。

映画の詳細テーブル

  • ムービー ID (PK)
  • ムービー名
  • 映画評価

ジャンル表

  • ジャンルID (PK)
  • ジャンル名

映画_ジャンルテーブル

  • MovieID (FK) -- GenreID を持つ複合主キー
  • ジャンル ID (FK)
于 2013-03-28T10:58:39.623 に答える
0

クエリ:

SELECT t.Movie_Name,
       t.Rating,
       g.Genre
FROM movie_test t
INNER JOIN movie_genre g ON t.Movie_ID = g.Movie_ID
WHERE t.Movie_ID = (SELECT t1.Movie_ID 
                    FROM movie_test t1
                    INNER JOIN movie_genre g1 ON t1.Movie_ID = g1.Movie_ID
                    WHERE g1.Genre = g.Genre
                    ORDER BY t1.Rating DESC
                    LIMIT 1)
于 2013-03-28T11:18:56.007 に答える
0

これは一般的な MySQL の問題です。集計クエリで非集計/非集計列を指定します。他の種類の SQL ではこれを行うことができず、警告が表示されます。

あなたのようなクエリを実行すると、集計グループ内の非集計列が選択されます。多くの行が同じジャンルを共有しているため、選択するMovie_Nameと、各グループからランダムに 1 つの行が選択されて表示されます。これは、必要な行を推測してその値を返す一般的なアルゴリズムがないためです。

「なぜランダムに選択するのですか?」と尋ねるかもしれません。max(Rating) が属するものを選択できますか?」しかし、avg(Rating) のような他の集計列はどうでしょうか? そこではどの行が選択されますか? とにかく、2 つの行の最大値が同じ場合はどうなるでしょうか。したがって、行を選択するアルゴリズムを持つことはできません。

このような問題を解決するには、次のようにクエリを再構築する必要があります。

select Movie_Name, 
    Rating,
    Genre from movie_test mt
inner join movie_genre 
where movie_test.Movie_ID = movie_genre.Movie_ID 
and Rating = (select max(Rating) from movie_test mt2 where mt.Genre = mt2.Genre
group by Genre
limit 1

これにより、サブクエリを使用して、評価がそのジャンルの最大評価と同じである行が選択されます。

于 2013-03-28T10:59:34.160 に答える