我有2个表,我需要计算每个电影中显示的任何角色的次数
表的示例:
电影表
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)
我认为我对在这种情况下应该使用的内容没有适当的了解,任何人都可以向我指出正确的方向而不只是给我答案吗?
?奖金:
我还需要滤除任何至少没有6个标题(角色。
您真的很接近,只需要调整您的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(*)
将以相同的方式计算行。
您的查询:
SELECT TITLE, COUNT(ROLE.MOVIEID) AS NUMROLES
FROM MOVIE, ROLE
GROUP BY TITLE;
在这里,您在表MOVIE
&ROLE
。这会导致您取得错误的结果。
您需要的是基于 common Comman MOVIEID
的Inner Join
的CC_10。
以下查询应起作用:
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
的更多信息。