2017-12-06 13 views
3

私は2つのテーブルを持っていると私はどんな役割は、表の各映画カウント複数の項目 - mysqlの

例に現れる回数をカウントする必要があります。

作品私がどのように見えるの出力を取得したいと思い表

TITLE   MOVIEID  OTHER STUFF.... 
------------- ------- 
MOVIE TITLE 1 ID# 1 
MOVIE TITLE 2 ID# 2 
MOVIE TITLE 3 ID# 3 
ETC... 

ロールテーブル

ROLEID  MOVIEID  OTHER STUFF.... 
-------  ------- 
ROLE #1  ID# 1 
ROLE #2  ID# 1 
ROLE #3  ID# 2 
ROLE #4  ID# 2 
ROLE #5  ID# 3 
ROLE #6  ID# 4 
ROLE #7  ID# 5 
ROLE #8  ID# 3 
ETC.... 

この:

TITLE   NUMROLES 
------------- -------------------------------------- 
MOVIE TITLE 1 COUNT (ROLE.MOVIEID) FOR MOVIE TITLE 1 
MOVIE TITLE 2 COUNT (ROLE.MOVIEID) FOR MOVIE TITLE 2 
MOVIE TITLE 3 COUNT (ROLE.MOVIEID) FOR MOVIE TITLE 3 
MOVIE TITLE 4 COUNT (ROLE.MOVIEID) FOR MOVIE TITLE 4 
MOVIE TITLE 5 COUNT (ROLE.MOVIEID) FOR MOVIE TITLE 5 
ETC... 

私は、いくつかの異なるものを試してみましたが、私はいつも個別にカウントされるのではなく、それらのすべてのロールの合計数を取得するように見えます。

私の「最高の」出力例:私は、私はこのケースで使用すべきかの適切な知識を持っていない考えています

mysql> SELECT TITLE, COUNT(ROLE.MOVIEID) AS NUMROLES 
    -> FROM MOVIE, ROLE 
    -> GROUP BY TITLE; 
+-----------------------------+----------+ 
| TITLE      | NUMROLES | 
+-----------------------------+----------+ 
| Amadeus      |  138 | 
| Apollo 13     |  138 | 
| Batman      |  138 | 
| Batman & Robin    |  138 | 
| Batman Begins    |  138 | 
| Batman Forever    |  138 | 
| Batman Returns    |  138 | 
| Casablanca     |  138 | 
| Dirty Harry     |  138 | 
| Few Good Men, A    |  138 | 
| Field of Dreams    |  138 | 
| Fly, The     |  138 | 
| Forrest Gump    |  138 | 
| Godfather, The    |  138 | 
| Gone with the Wind   |  138 | 
| Jerry Maguire    |  138 | 
| Mrs. Doubtfire    |  138 | 
| Naked City, The    |  138 | 
| Sixth Sense, The   |  138 | 
| Sudden Impact    |  138 | 
| Terminator 2: Judgment Day |  138 | 
| Terminator, The    |  138 | 
| Tootsie      |  138 | 
| Wizard of Oz, The   |  138 | 
+-----------------------------+----------+ 
24 rows in set (0.02 sec) 

、誰もがちょうど与えることなく正しい方向に私を指すことができます私は答え??

ボーナス:

私も(ROLE.MOVIEID)のカウントに少なくとも6を持っていない任意のタイトルをフィルタリングする必要がある - 私はそのためにHAVING使用する必要があります考えています。

答えて

1

あなたは本当に近いです、ちょうどあなたのJOIN(それは述語が欠落している)を微調整し、あなたのボーナスのためにあなたのHAVINGを追加する必要があります。

SELECT TITLE, COUNT(*) AS NUMROLES 
FROM MOVIE M 
JOIN ROLE R ON M.MOVIEID = R.MOVIEID --This is the join predicate (condition) 
GROUP BY TITLE 
HAVING COUNT(*) > 5; 

これは、明示的JOIN構文です。これを暗黙的なバリアント(つまり、FROM句のコンマ)として使用することが最善です。とにかく償却され、使用するのが難しいからです。

必要に応じてCOUNT(r.movieID)を使用できますが、COUNT(*)は同じ方法で行を数えます。

+0

助けてくれてありがとう、私はある種の参加をする必要があるとはかなり確信していました。ある時点で左結合を試みましたが、間違っていました。 – programmingnovice

+0

@programmingnovice NP、あなたの質問にすべての詳細を含めてくれてありがとう。デフォルトでは 'JOIN'は' INNER JOIN'です。つまり、結果は両方のテーブルの一致のみに限定されます。 Ex。ロールのないムービーがある場合、上記のJOINには戻りません。 'LEFT JOIN'は 'left'テーブル(ムービー)のすべての行を保持し、 'right'テーブル(ロール)に存在しない値については' NULL'を表示します。この場合、通常は 'INNER JOIN'または' JOIN'が必要ですが、あなたが見たいと思う役割のない映画があれば、 'LEFT JOIN'が必要です。 –

+0

@programmingnoviceこれは、ジョインの良い、簡単なイメージです。https://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg –

1

あなたのクエリ:ここ

SELECT TITLE, COUNT(ROLE.MOVIEID) AS NUMROLES 
FROM MOVIE, ROLE 
GROUP BY TITLE; 

は、あなたがテーブルMOVIE & ROLECross Joinをやっています。それは間違った結果につながります。

共通の列MOVIEIDに基づくこれら2つのテーブルのうち、必要なものはInner Joinです。

次のクエリは動作するはずです:

SELECT m.TITLE, COUNT(r.MOVIEID) AS NUMROLES 
FROM MOVIE m 
inner join ROLE r 
on m.MOVIEID = r.MOVIEID 
GROUP BY m.TITLE 
having NUMROLES >=6; 

having NUMROLES >=6

は5または5未満のカウントで TITLEを除去するために使用されます。

JOINについてはclicking hereで詳しく見ることができます。

+0

あなたは1つの回答のみを受け入れることができます。 –