Исключение результатов из объединенных таблиц на основе единого значения счетчика - PullRequest
0 голосов
/ 13 марта 2019

У меня есть две таблицы, к которым я присоединяюсь, и я хотел бы исключить любой результат с числом больше 1 для значения во второй таблице.

Для этого примера у меня есть таблица с именемmovie_info, который содержит информацию о фильмах, каждый из которых имеет уникальный идентификатор.Вторая таблица с именем crew_info содержит информацию о съемочной группе каждого фильма (с уникальным идентификатором фильма), но вместо 1 записи на фильм, существует несколько записей для каждого члена экипажа.Визуально это будет выглядеть так:

+----------------------+
|       movie_info     |
+======================+
|       id  = '123'    |  
+----------------------+

+----------------------+
|       crew_info      |
+======================+
|       id = '123'     |
+----------------------+
|     name = 'John'    |
+----------------------+
|   role = 'director'  |
+----------------------+

+----------------------+
|       crew_info      |
+======================+
|       id = '123'     |
+----------------------+
|     name = 'Mary'    |
+----------------------+
|   role = 'director'  |
+----------------------+

+----------------------+
|       crew_info      |
+======================+
|       id = '123'     |
+----------------------+
|      name = 'Sue'    |
+----------------------+
|     role = 'writer'  |
+----------------------+

Я соединяю две таблицы примерно так:

SELECT a.id, b.*
FROM movie_info as a
LEFT JOIN crew_info as b
on a.id = b.id

Пока это все стандартно.Однако я пытаюсь сделать так: only возвращает результаты, в которых crew_info имеет счет только 1 директор.Таким образом, отдельный запрос, подобный следующему:

SELECT id
FROM crew_info
WHERE role = 'director'
HAVING count(id) = 1

успешно исключает результаты, подобные этому примеру, где имеется более 1 директора.Но как именно я могу объединить это с таблицей movie_info, чтобы все это было в одном запросе?

Извините, если это неясно.Я относительно новичок в SQL, поэтому, пожалуйста, дайте мне знать, если есть что-то, что я не выразил правильно.Спасибо.

РЕДАКТИРОВАТЬ: Еще одна вещь, о которой я забыл, извините!Если счетчик на больше 1, как мне по-прежнему включать результаты, если сопоставляется другое значение?Допустим, у movie_info также было поле с именем sequel_id, которое заполняется только в том случае, если фильм является продолжением.Я хочу исключить результаты с числом директоров> 1 И пустым или нулевым sequel_id, но включать результаты с числом директоров> 1 И действительным sequel_idзначение.Я пробовал что-то вроде (HAVING COUNT(*) = 1 OR (HAVING COUNT(*) > 1 AND sequel_id IS NOT NULL)), но я получаю синтаксическую ошибку.

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Просто используйте существующий запрос как подзапрос EXISTS:

SELECT *
FROM movie_info
WHERE EXISTS (
    SELECT 1
    FROM crew_info
    WHERE crew_info.id = movie_info.id
    AND crew_info.role = 'director'
    HAVING COUNT(*) = 1
)
OR sequel_id IS NOT NULL
1 голос
/ 13 марта 2019

попробуйте, как показано ниже, используя cte

with cte as
(
SELECT id
FROM crew_info
WHERE role = 'director'
HAVING count(id) > 1
) select a.*,b.id  FROM movie_info as a
LEFT JOIN cte as b
on a.id = b.id

без cte, вы также можете выполнить подзапрос

select a.*,b.id FROM movie_info as a
left join (
          SELECT id
         FROM crew_info
         WHERE role = 'director'
         group by id
         HAVING count(id) > 1
          ) b on a.id=b.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...