首页 > 解决方案 > 获取跨多个表的不同值的计数(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 是可行的,所以我一定是错误地嵌入了它。任何帮助发现错误将不胜感激。

标签: mysqlcountsubqueryunion

解决方案


相关子查询需要有一个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默认情况下会删除重复项。


推荐阅读