mysql - 获取跨多个表的不同值的计数(MySQL)
问题描述
我有一个看起来基本上像这样的数据库:
Table `person_dir`:
int person_ID
varchar firstname
varchar lastname
enum division
Table `prod_staff`:
int prod_ID
int staff_ID
int role_ID
Table `prod_cast`:
int prod_ID
int cast_ID
varchar role_name
我想做的是根据他们参与的制作数量(无论是作为工作人员还是演员),在给定部门中选出前 10 名。一个人可以在给定的作品中同时担任工作人员和演员,因此仅获得两个 COUNT 并不能给出准确的数字。
我的查询如下所示:
SELECT pers_ID, firstname, lastname,
COUNT(DISTINCT prod_ID) FROM (
(SELECT prod_ID
FROM prod_staff
WHERE staff_ID = person_dir.person_ID)
UNION
(SELECT prod_ID
FROM prod_cast
WHERE cast_ID = person_dir.person_ID)
) AS maxnum
FROM person_dir
WHERE division = 'north'
ORDER BY maxnum DESC
LIMIT 10
当我尝试运行它时,我收到一条错误消息,提示“FROM person_dir”行存在语法错误。单独在查询中运行 COUNT 是可行的,所以我一定是错误地嵌入了它。任何帮助发现错误将不胜感激。
解决方案
相关子查询需要有一个SELECT
语句并用括号括起来。但是您不能将相关性嵌套 2 层深,因此您所写的内容将不起作用。
您可以改为加入获取每个 ID 计数的子查询。
SELECT person_ID, firstname, lastname, maxnum
FROM person_dir
JOIN (
SELECT person_ID, COUNT(*) AS maxnum FROM (
SELECT staff_ID AS person_ID, prod_ID
FROM prod_staff
UNION
SELECT cast_ID AS person_ID, prod_ID
FROM prod_cast
) AS x
GROUP BY person_ID
) AS prodcount ON prodcount.person_ID = person_dir.person_ID
WHERE division = 'north'
ORDER BY maxnum DESC
LIMIT 10
您不需要COUNT(DISTINCT)
,因为UNION
默认情况下会删除重复项。
推荐阅读
- java - Java LocalDateTime 模式
- python - 无法理解的解析器行为
- google-api - 如何在没有 oauth 的情况下使用谷歌日历 API 访问用户谷歌日历信息?
- python - 最新 Python 版本 3.8.2 的导入错误没有名为 tkinter 的模块问题
- macos - 如何在 Mac/UNIX 的 osascript 对话框中添加密码输入表单
- android - RecyclerView 项目宽度在迁移到视图绑定后变为 wrap_content
- c++ - 通过匹配键的子元素来查找地图中的任何元素
- c++ - 类语法问题
- javascript - 为什么在 javascript 的 for-in 循环中执行 return 语句后的代码?
- google-apps-script - 从另一个帐户复制时需要打开电子表格