Запрос, который выбирает идентификаторы пары дочерних компаний с одинаковыми фильмами - PullRequest
0 голосов
/ 16 ноября 2018

Итак, у меня есть промежуточная таблица в MySQL, называемая «Inventory», с двумя PK: idMovie и idSubsidiary.Эта таблица выглядит следующим образом:

----------------------------------
idMovie (int) | idSubsidiary (int)
----------------------------------
0             | 0
2             | 0
1             | 1
3             | 2
----------------------------------

Я хочу выбрать идентификаторы пары дочерних компаний, которые имеют точно такие же фильмы.

Для этого я былдумать о чем-то вроде этого:

select distinct inv1.idSubsidiary, inv2.idSubsidiary
from    inventory inv1
join    inventory inv2
on      inv1.idSubsidiary <> inv2.idSubsidiary
where not exists (

    SELECT i1.idSubsidiary, i1.idMovie , i2.idSubsidiary, i2.idMovie 
    FROM inventory i1
    INNER JOIN inventory i2 ON i1.idMovie = i2.idMovie 
    WHERE (i1.idSubsidiary= inv1.idSubsidiary and i2.idSubsidiary= inv2.idSubsidiary
    AND i2.idSubsidiary IS NULL

)

Результат, который я ищу, будет примерно таким:

idSubsidiary | idSubsidiary
---------------------------
0            | 1
3            | 4

Итак, дочерние 0 и 1 имеют одинаковые одинаковые фильмы наинвентаризация, то же самое с 3 и 4.

Однако ранее показанный запрос не работает.По сути, запрос ищет пары идентификаторов SubsidiaryID в Inventory, а затем выполняет вложенный запрос, чтобы определить, есть ли у первой дочерней компании какой-либо фильм, которого нет у второй дочерней компании.Если они этого не делают, он выбирает оба.

Однако вложенный запрос не работает.Как я уже сказал, я хочу сделать левое соединение той же таблицы без внутренней части.

Любая помощь очень ценится:)

1 Ответ

0 голосов
/ 16 ноября 2018

Самый простой метод в MySQL - выполнить двойное агрегирование:

select movies, group_concat(idSubsidiary) as subsidiaries
from (select i.idSubsidiary, group_concat(idMovie order by idMovie) as movies
      from inventory i
      group by i.idSubsidiary
     ) s
group by movies
having count(*) > 1;

Каждая строка в наборе результатов представляет собой набор фильмов с набором идентификаторов, которые имеют именно эти фильмы.Это дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...