我有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个(ROLE.MOVIEID)数量的标题 - 我想我需要使用HAVING。
答案 0 :(得分:1)
您的查询:
SELECT TITLE, COUNT(ROLE.MOVIEID) AS NUMROLES
FROM MOVIE, ROLE
GROUP BY TITLE;
在这里,您在Cross Join
&表之间进行MOVIE
ROLE
。这会导致错误的结果。
此处您需要的是基于公共列 Inner Join
的这两个表中的MOVIEID
。
以下查询应该有效:
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
。
您可以clicking here了解JOIN
的更多信息。
答案 1 :(得分: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(*)
会以相同的方式计算行数。