跨多个表获取不同值的计数(MySQL)

时间:2018-12-15 06:11:41

标签: mysql count subquery union

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

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即可,因此我必须将其嵌入错误。找出错误的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

相关的子查询需要具有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默认会删除重复项。

相关问题