0

いくつかのテーブルの結合に問題があります。私の構造は次のとおりです。

tbl_imdb:
fldID   fldTitle    fldImdbID
1       Moviename   0000001

tbl_genres:
fldID   fldGenre
1       Action
2       Drama

tbl_genres_rel:
fldID   fldMovieID  fldGenreID
1       1           1
2       1           2

私がやろうとしているのは、アクション映画とドラマの両方であるすべての映画を検索するクエリです。サブクエリなしでこれを行うことは可能ですか?

私が今しようとしているのは:

SELECT tbl_imdb.*
FROM tbl_imdb
LEFT JOIN tbl_imdb_genres_rel ON ( tbl_imdb.fldID = tbl_imdb_genres_rel.fldMovieID ) 
LEFT JOIN tbl_imdb_genres ON ( tbl_imdb_genres_rel.fldGenreID = tbl_imdb_genres.fldID ) 
WHERE tbl_imdb_genres.fldGenre =  'Drama'
AND tbl_imdb_genres.fldGenre =  'Action';

しかし、これは機能しませんが、2 つの WHERE のうちの 1 つだけを保持している場合は機能しますが、それは私が望むものではありません。

4

2 に答える 2

0

LEFT JOIN両方のテーブルにレコードが存在する必要があるため、あなたのケースには適用されません。countそして、映画のインスタンスが必要です

SELECT  *
FROM    tbl_imdb a 
            INNER JOIN tbl_genres_rel b
                on a.fldID = fldMovieID
            INNER JOIN tbl_genres c
                on c.fldGenreID = b.fldID
WHERE   c.fldGenre IN ('Drama', 'Action')
GROUP BY a.Moviename
HAVING COUNT(*) > 1
于 2012-08-02T22:24:24.833 に答える
0

それを行う2つの方法:

1

SELECT     tbl_imdb.*
FROM       tbl_imdb
INNER JOIN tbl_genres_rel            rel_action  
ON         tbl_imdb.fldID          = rel_action.fldMovieID 
INNER JOIN tbl_genres                genre_action
ON         rel_action.fldGenreId   = genre_action.fldID 
AND        'Action'                = genre_action.fldGenre
INNER JOIN tbl_genres_rel            rel_drama  
ON         tbl_imdb.fldID          = rel_drama.fldMovieID 
INNER JOIN tbl_genres                genre_drama
ON         rel_drama.fldGenreId    = genre_drama.fldID 
AND        'Drama'                 = genre_drama.fldGenre

この方法は、元のソリューションと同じパスにあります。2 つの違い:

  1. 確実に対応するジャンル エントリを持つ映画を取得しようとしているため、結合は左ではなく内部にする必要があります。
  2. 2 つの異なるジャンルを見つけたいので、関心のある特定のジャンルごとに 1 回ずつ、tbl_genres_rel と tbl_genres で 2 回結合を行う必要があります。

2

SELECT     tbl_imdb.*
FROM       tbl_imdb
INNER JOIN tbl_genres_rel              
ON         tbl_imdb.fldID            = tbl_genres_rel.fldMovieID 
INNER JOIN tbl_genres                
ON         tbl_genres_rel.fldGenreId = tbl_genres.fldID 
AND        tbl_genres.fldGenre      IN ('Action', 'Drama')
GROUP BY   tbl_imdb.fldID
HAVING     COUNT(*) = 2

ここでも、基本的な参加プランは同じです。ここでの違いは、tbl_genres_rel および tbl_genres パスに一度だけ参加することです。これ自体で、1 つの映画のすべてのジャンルを取得し、関心のあるものをフィルター処理します。資格のあるものには、tbl_imdb.fldId の個別の値ごとに 2 つの行が含まれます。GROUP BY はそれを集約し、それを 1 行にフラット化します。ちょうど 2 つの行があることを句でアサートすることにより、HAVING両方のジャンルを持つ行のみを保持するようにします。

(これは、{fldMovieID, fldGenreID} に対する tbl_genres_rel に一意の制約があることを前提としていることに注意してください。そのような制約が存在しない場合は、それを追加することを検討する必要があります。)

于 2012-08-02T22:19:20.657 に答える