获取多个表中不同值的计数(mysql)

jtoj6r0c  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(383)

我有一个数据库,基本上是这样的:

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名,无论是作为工作人员还是演员。一个人有可能在一部作品中同时扮演工作人员和演员的角色,所以仅仅得到两个数字并不能给出一个准确的数字。
我的查询如下:

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\u dir”行中有语法错误。单独在查询中运行count是可行的,所以我一定是把它嵌入错了。如果您能帮忙找出错误,我们将不胜感激。

roqulrg3

roqulrg31#

相关子查询需要有 SELECT 语句并用括号括起来。但是你不能把相关性嵌套在两个层次的深处,所以你写的东西是行不通的。
您可以改为使用一个子查询联接,该子查询获取每个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 默认情况下删除重复项。

相关问题