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

标签 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。

最佳答案

你真的很接近,只需要调整你的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.movi​​eID),但 COUNT(*) 将以相同的方式计算行数。

关于mysql - 计算同一列中的多个项目从 2 个表中提取数据 - mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47682881/

相关文章:

php - jQuery .post 不会读取 PHP include

mysql:无法识别的语句类型。 (靠近 SCHEDULE)尝试创建事件日程时

sql - 合并两个表而不重复

php - 如何搜索 mysql 表,以便它只返回包含存储在另一个表中的可选 Actor 列表的 DVD?

sql - 如何使用元组创建 WHERE 条件

mysql - 一次将 3 次 2 列合并为一个命令中的一个

mysql - 计算远程表中每一行的总匹配数

sql - 如何避免对 IN 子句重复此子查询?

sql - 用 Select 查询替换 While 循环

c# - 如何以编程方式确定我是否具有对数据库的执行权限?