Выберите строки, содержащие одинаковые значения

#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