Условия задачи: есть некая БД, где есть строки, в которых значения одного столбца равны, и значения второго столбца имеют одинаковые значения. Необходимо написать SQLзапрос для вывода строк, подпадающих под условия задачи.
Реальный кейс с моей работы на должности веб тестировщика. На торговом портале данные по заказам пишутся в БД. Изначально предполагалось, что в рамках одного заказа не может быть более одной строки с одним и тем же товаром. В какой-то момент момент эта логика на портале сломалась и мне поставили задачу на поиск заказов с дублями товаров.
По простому нужно было найти в базе данных заказы, в которых один и тот же товар в заказе был прописан более одного раза. Наглядно эту проблему можно изучить на следующем рисунке:
Сходу задачу решить не удалось, пришлось поломать голову. В итоге sql запрос, позволяющий вывести все дубли, оказался не таким и сложным. Было сделана выборка одной и той же таблицы и потом произведено сравнение с помощью оператора JOIN.
Окончательное решение выглядит так:
SELECT ord.* FROM Orders AS ord JOIN(SELECT * FROM Orders GROUP BY DELIVERY_TIME, USER_ID HAVING COUNT(DELIVERY_TIME)>1 ORDER BY DELIVERY_TIME) AS tmp
ON (ord.USER_ID=tmp.USER_ID AND NOT ord.ORDERS_ID=tmp.ORDERS_ID AND ord.DELIVERY_TIME=tmp.DELIVERY_TIME) WHERE tmp.ORDERS_ID IS NOT NULL;
Кому интересно, как этот запрос работает на конкретном примере, смотрите видео. В нем все расписано элементарным языком. Как говорится, все показываю на пальцах:
Если данный запрос завершается ошибкой: The ONLY_FULL_GROUP_BY issue, то рекомендую перед выполнением запроса выполнить следующую команду:
set session sql_mode='';
Мне это помогло.