我有一个基本上像这样的数据库:
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即可,因此我必须将其嵌入错误。找出错误的任何帮助将不胜感激。
答案 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
默认会删除重复项。