#mysql #database
Вопрос:
Мне нужно извлечь пары StoreID, которые содержат одинаковые фильмы, используя эту таблицу в качестве небольшого примера
StoreID | MovieID |
---|---|
1 | a |
1 | b |
1 | c |
2 | a |
2 | b |
2 | c |
3 | d |
Результирующим запросом должны быть StoreID 1 и StoreID 2, поскольку они используют одни и те же фильмы.
Ответ №1:
Этот запрос:
SELECT storeID, GROUP_CONCAT(movieID ORDER BY movieID) movies
FROM tablename
GROUP BY storeID
возвращает все фильмы каждого магазина в виде списка, разделенного запятыми.
Используйте его как CTE и с помощью самостоятельного соединения получите пары магазинов с одинаковыми фильмами:
WITH cte AS (
SELECT storeID, GROUP_CONCAT(movieID ORDER BY movieID) movies
FROM tablename
GROUP BY storeID
)
SELECT c1.storeID storeID1, c2.storeID storeID2
FROM cte c1 INNER JOIN cte c2
ON c1.movies = c2.movies AND c1.storeID < c2.storeID
Комментарии:
1. Представьте, что 10 (или 100) StoreID имеют один и тот же список идентификаторов фильмов… ваш вывод будет слишком длинным.
2. @Akina Мне нужно извлечь пары StoreID, которые содержат одинаковые фильмы .Это требование.
3. Это правда. Может быть, этот вариант действительно больше подходит для OP.
Ответ №2:
WITH cte AS ( SELECT storeID, GROUP_CONCAT(movieID ORDER BY movieID) movies
FROM table
GROUP BY storeID )
SELECT GROUP_CONCAT(storeID)
FROM cte
GROUP BY movies
HAVING COUNT(*) > 1