计算同一列中的多个项目,从2个表中提取数据 - mysql

时间:2017-12-06 20:24:07

标签: mysql sql

我有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。

2 个答案:

答案 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(*)会以相同的方式计算行数。