Получение количества различных значений в нескольких таблицах (MySQL) - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть БД, которая выглядит примерно так:

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 голосов
/ 15 декабря 2018

Коррелированный подзапрос должен иметь оператор SELECT и заключаться в скобки.Но вы не можете вкладывать корреляцию глубиной 2 уровня, поэтому то, что вы пишете, не сработает.

Вместо этого вы можете присоединиться к подзапросу, который получает значения для каждого идентификатора.

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 по умолчанию удаляет дубликаты.

...