2017-09-16 12 views
0

タイトルはあまり有用ではないことを知っている。私自身がこれを理解することが難しい理由の一部だ。それを言葉にするために、私はそれをGoogleにすることはできません。MySQL - IDは同じだが別の列にある特定の値を持つ行を取得する

とにかく、映画とテレビ番組が私のDVDコレクションからリッピングされたNetflixスタイルのウェブサイトを作っています。私のラズベリーパイを走っているLAMPスタックです。たくさんのチェックボックスからジャンルを選択してジャンル別に検索するオプションがあります。私はそれが "ホラー"と "コメディ"をチェックすると、検索結果は/またはどちらのジャンルでもなく、それらのジャンルの両方を持っている映画/テレビ番組のみを返すように機能したいと思います。

私はいくつかのMySQLテーブル、THR_MOVIE、THR_SHOW、THR_GENREを持っています。 THR_MOVIEとTHR_SHOWの構造は、この質問ではあまり重要ではありません。それぞれのムービー/テレビ番組がただ1つの行を持ち、一意のIDを持つことを知っているだけです。ここTHR_GENREの構造があります:

CREATE TABLE `THR_GENRE` (
`media_id` INT(7) UNSIGNED NOT NULL, 
`genre` VARCHAR(255) NOT NULL, 
`media_type` ENUM('movie','show') NOT NULL, 
`date_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (`media_id`, `genre`, `media_type`)) 

を明らかにmedia_typeこのは '映画' である場合、media_idこのオプションでは、THR_MOVIEのIDとないTHR_SHOW IDです。ジャンルテーブルのデータの例を次に示します。

row 1: media_id=12, genre='horror', media_type='movie' 
row 2: media_id=12, genre='comedy', media_type='movie' 

このクエリはどのように機能しますか?ムービーのデータを取得する必要があるので、THR_GENREとTHR_GENREを組み合わせて映画を入手し、THR_SHOWとTHR_GENREを使ってテレビ番組を取得する必要があります。

+0

あなたの質問を更新すると、実際に使用しているクエリと予想される結果が追加されます。 – scaisEdge

答えて

0

あなたはleft outer joinを使用する可能性があります:

select 
    * 
from 
    THE_GENRE g 
left outer join 
    THR_MOVIE m 
    on m.id = g.media_id 
    and g.media_type = 'movie' 
left outer join 
    THR_SHOW s 
    on s.id = g.media_id 
    and g.media_type = 'show' 

クエリは、映画やショーのテーブルの両方の列を返します。このクエリ結果を使用するコードは、typeが 'movie'の場合はmovieテーブルの列を、タイプがshowの場合はshowテーブルの列を使用する必要があります。

0

返信いただきありがとうございますが、私は自分でそれを理解しました。

select * 
from THR_GENRE 
where (genre='horror' 
or genre='comedy') 
and media_type='movie' 
group by media_id 
having count(*)=2 

明らかに私のPHPスクリプトは、Xは、ジャンルの数を保持するいくつかの変数が検索され、カウント(*)= X、とクエリ文字列を作成する必要があります。

関連する問題