2013-07-01 5 views
15

から得ローの選択は、私は現在、私のデシベルに2つのMySQLのテーブルを持っている別のテーブルMYSQL

FilmFilm_Ratings_Report

フィルムの主キーは、フィルムを識別するために使用されているfilmidですFilm_Ratings_Reportの評価

私は、MySQLのクエリを使用して、可能な場合にのみ評価テーブルを検索し、フィルム表から映画のタイトルを取得するために選択されたIDを使用し、一定の基準に適合する全てのフィルムのIDを収集するために知っていただきたいと思います。以下は、使用していないMYSQLクエリのImです:

SELECT * 
FROM film 
UNION SELECT filmid 
     FROM film_rating_report 
     WHERE rating = 'GE' 
     LIMIT 0,0 

私はMYSQLには比較的緑で、これに関する助けに感謝します。アドバンス

+0

使用することができますがあるかもしれないので、あなたが、by' 'グループを使用する必要が – leet

答えて

16
SELECT * FROM film WHERE id IN 
    (SELECT filmid FROM film_rating_report WHERE rating = 'GE'); 

おかげで、私はこれが動作すると信じて

-1

を動作するはずです、(あなたのテーブルのCREATE TABLEのSHOWを与えることを検討)、私が知る方法がありません、あなたのDBの構造を知らなくてもと思いました確認:

SELECT film.* 
FROM (film) 
LEFT JOIN film_rating_report ON film.filmid = film_rating_report.filmid AND film_rating_report.rating = 'GE' 
WHERE film_rating_report.filmid IS NOT NULL 
GROUP BY film.filmid 

(film_rating_report.filmidがが定格を持っていない行を防止NULLではありませんますfilm_rating_reportが複数回に一致する可能性があるためでこっそりから求めて再、私は最後に BY GROUPを追加しました - 私はそれに格納されたデータへの可視性を持つようわからない)

このため
+0

別名はレポートテーブルの重複する行 – TMS

3

好ましい解決策はjoinを使用することです

select film.* 
from film 
join film_rating_report on film.filmid = film_rating_report.filmid 
     and rating = 'GE' 
group by film.filmid 

EDIT:として正しく@ypercubeで述べたように、私はで&グループに参加のパフォーマンスは、サブクエリを使用するよりも優れていると主張して間違っていた、とあなたは重複行を持たないようにgroup byが忘れてはいけませんexistsまたはin - 全く反対です。

+0

downvotesは、 ained – TMS

+0

私はdownvotedしていないが、あなたが提供している複雑なLEFT JOIN/IS NOT NULLは単純な 'INNER JOIN'(' NOT NOT 'なし)に相当します。そしてLEFT JOINsが常に良いという主張'IN'や' EXISTS'サブクエリよりも奇妙に見えます。この主張の正当性/リンク –

+0

@ypercubeありがとう!私は左の結合を頻繁に使用するので、これは通常のものを使用して行うことができないことを忘れていました:-)サブクエリの場合、サブクエリは一時テーブルの作成を伴うかもしれないので – TMS

1

問合せ:

SELECT t1.* 
FROM film t1 
WHERE EXISTS (SELECT filmid 
       FROM film_rating_report t2 
       WHERE t2.rating = 'GE' 
       AND t2.filmid = t1.id); 
12

例えば、あなたがsemi-joinをしたいようです結合された2つのテーブルの1つからのデータのみが必要な結合。この場合、希望の条件(rating = 'GE')を持つfilm_rating_reportに一致する行があるfilmのすべての行が表示されます。

2番目のテーブルに2(またはそれ以上)の行がある(2つの映画の評価が両方とも'GE')場合でも、まだ1度だけフィルムを表示したいので、通常の結合では2回(またはそれ以上)表示されません。

は書くための様々な方法があります半結合と最も人気があります:IN(無相関)サブクエリを使用して

SELECT t1.* 
FROM film t1 
WHERE EXISTS (SELECT filmid 
       FROM film_rating_report t2 
       WHERE t2.rating = 'GE' 
       AND t2.filmid = t1.id); 
  • EXISTS相関サブクエリ(@Justin's answer)を使用して

    • @SG 86's answer):
      (これは予期しない結果を返す可能性があるため慎重に使用するか、まったく使用しないでください)
      (とGROUP BY作品のこの特定の使用ことに注意してください:(この場合は2 filmidは)結果(@Tomas' answer)で重複行を避けるためにGROUP BYと通常のJOINを使用して

      SELECT * 
      FROM film 
      WHERE id IN 
          (SELECT filmid 
          FROM film_rating_report 
          WHERE rating = 'GE' 
      ); 
      
    • )空白可能ですGROUP BY f.filmid, f.title, f.director, ...

      SELECT f.* 
      FROM film AS f 
          JOIN film_rating_report AS frr 
           ON f.filmid = frr.filmid 
      WHERE frr.rating = 'GE' 
      GROUP BY f.filmid ; 
      
    • VA:あなたが他のDBMSで同様のクエリを作成したい場合、MySQLだけにしてはPostgresの最近のバージョンでは、あなたはすべての列を含める必要がありますGROUP BYJOINその後、派生テーブル上で行われ、@ Tomas'es答え、上riation:

      SELECT f.* 
      FROM film AS f 
          JOIN 
           (SELECT filmid 
            FROM film_rating_report 
            WHERE rating = 'GE' 
            GROUP BY filmid 
           ) AS frr 
           ON f.filmid = frr.filmid ; 
      

    が使用する1つは、のために(RDBMS、あなたが使用している特定のバージョンに依存しますなど、彼らは非効率的な実行計画を生成することと、INサブクエリは、MySQLのほとんどのバージョンでは避けるべきである例)、特定のテーブルのサイズ、分布、インデックス、

    私は通常EXISTSソリューションを好むが、それは最初のテストに痛いことはありませんあなたが持っている、または期待しているテーブルサイズのさまざまなクエリ将来的にあなたのケースに最適なクエリインデックスの組み合わせを見つけようとします。


    追加:何の映画はこれまで2と同じ評価を得ていないか、またはより厳しい(しかし、よりもっともらしいが)がある場合ということを意味film_rating_report (filmid, rating)組み合わせ、film_rating_report (filmid)その手段に一意制約上の固有の制約がある場合すべてのフィルムは最大1つの評価を持っている、あなたがJOINソリューションを簡素化することができます(および他のすべてのクエリを取り除く)こと:

    SELECT f.* 
        FROM film AS f 
         JOIN film_rating_report AS frr 
          ON f.filmid = frr.filmid 
        WHERE frr.rating = 'GE' ; 
    
  • +1

    Ypercubeこれはすばらしい答えです、ありがとう、今はっきりしています! – TMS

    +0

    あなたの親切な言葉のために@Tomas thnx。 –

    +0

    あなたは大歓迎です:-) – TMS

    関連する問題