Найти дубликат во многих отношениях многих

У меня есть таблица базы данных MySQL, которая отображает отношение многие ко многим. Таблица базы данных содержит два столбца, которые являются внешними ключами от других таблиц. Таким образом, эта таблица базы данных существует только для назначения внешнего ключа из таблицы A внешнему ключу из таблицы B.

Структура таблицы

столбец 1: conditionID (int11) (внешний ключ)
столбец 2: packageID (int11) (внешний ключ)

CREATE TABLE `many_to_many_table` (
`conditionID` int(11) NOT NULL,
`packageID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `many_to_many_table`
ADD KEY `conditionID` (`conditionID`,`packageID`);

Я хочу выяснить, существует ли комбинация в этой таблице. Например, у пользователя есть условия с идентификаторами 1, 2 и 3. С этими идентификаторами пакет с идентификатором 1 уже существует. Записи 1 | 1, 1 | 2 и 1 | 3.

Пример данных

INSERT INTO `many_to_many_table` (`conditionID`, `packageID`) VALUES
(1, 195), (2, 195), (3, 195), (4, 197), (5, 197), (5, 209), (6, 198), (6, 211), (6, 219), (6, 220);

С этими примерами данных запрос должен вернуть packageID 195.

Я попробовал следующее:

SELECT
packageID,
conditionID,
(
SELECT
COUNT(*)
FROM
many_to_many_table
WHERE
conditionID IN (1,2,3)
) AS rowCount
FROM
many_to_many_table
GROUP BY
packageID
HAVING
conditionID IN (1,2,3)
AND
rowCount = 3

Это работало нормально в первый момент. Но он выбирает записи, которые имеют только conditionID 1 или conditionID 2 и другой packageID. Этот запрос недостаточно точен, чтобы получить дубликаты.

Возможно ли это одним запросом?

2

Решение

Если я вас правильно понимаю, вы хотите:

SELECT packageID
FROM    many_to_many_table
WHERE conditionId IN (1,2,3)
GROUP BY    packageID
HAVING SUM(conditionId = 1) > 0
AND SUM(conditionId = 2) > 0
AND SUM(conditionId = 3) > 0;

DBFiddle

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector