Найти точный дубликат по полю таблицы соединений

0

Я пишу запрос, чтобы найти точный дубликат заказа по его идентификаторам pruducts.

Условиями для поиска дубликатов являются:

1) Заказ имеет тот же подсчет продукта.

2) Все идентификаторы продуктов одинаковы.

Пробовал что-то подобное, но это не сработало:

SELECT
  order.*,
  count(same_products.id),
  count(all_products.id)
FROM orders
  LEFT JOIN products AS all_products ON all_products.order_id = orders.id
  LEFT JOIN products AS same_products
    ON same_products.order_id = orders.id AND same_products.id IN (30868, 30862)
GROUP BY orders.id
HAVING count(same_products.id) = 4 AND count(all_products.id = 4)
  • 1
    Вы всегда знаете, что такое список идентификаторов продуктов?
  • 0
    @TimBiegeleisen да
Показать ещё 1 комментарий
Теги:

2 ответа

0

если вы хотите подсчитать повторяющиеся строки, вы должны избегать выбора всех столбцов (*), потому что, если у вас есть инкрементные значения в ваших столбцах, вы не можете найти дубликаты.

  SELECT
  order.id
  count(same_products.id),
  count(all_products.id)
FROM orders
  LEFT JOIN products AS all_products ON all_products.order_id = orders.id
  LEFT JOIN products AS same_products
    ON same_products.order_id = orders.id AND same_products.id IN (30868, 30862)
GROUP BY orders.id
HAVING count(same_products.id) >1 OR count(all_products.id )> 1

и для дублированной строки вы должны проверить значение count> 1 (для обоих счетчиков) и быть осторожным с count (all_products.id = 4), если вам нужно отфильтровать это значение, вы должны добавить это в состояние для соответствующей таблицы, например:

  SELECT
  order.id
  count(same_products.id),
  count(all_products.id)
FROM orders
  LEFT JOIN products AS all_products ON all_products.order_id = orders.id and all_products.id =4
  LEFT JOIN products AS same_products
    ON same_products.order_id = orders.id AND same_products.id IN (30868, 30862)
GROUP BY orders.id
HAVING count(same_products.id) >1
  • 0
    Это ничего не изменило. С чего бы это, если я все равно сгруппируюсь по orders.id?
  • 0
    Да ... группировка по идентификатору ... ... в любом случае я добавил предложение и исправил счет (all_products.id = 4) .. дайте мне знать, какова ваша реальная цель ..
0

Я не совсем понимаю, что вы на самом деле имеете в виду по дублированию, я предполагаю из вашего описания, что он 2 заказа с теми же продуктами. Это кажется немного упрощенным, например,

MariaDB [sandbox]> select * from orders;
+------+---------------------+-------------+
| id   | order_created       | customer_id |
+------+---------------------+-------------+
|    1 | 2016-01-01 00:00:00 |           1 |
|    2 | 2016-02-01 00:00:00 |           1 |
|    3 | 2016-03-01 00:00:00 |           1 |
|    4 | 2016-01-01 00:00:00 |           2 |
|    5 | 2016-02-01 00:00:00 |           2 |
|    6 | 2016-01-01 00:00:00 |           3 |
|   10 | 2016-12-01 00:00:00 |           4 |
+------+---------------------+-------------+
7 rows in set (0.00 sec)

MariaDB [sandbox]> select * from order_details;
+----+---------+-----------+------+
| id | orderid | productid | qty  |
+----+---------+-----------+------+
|  1 |       1 |      1213 |   10 |
|  2 |       1 |      9999 |   10 |
|  3 |       2 |      8888 |   10 |
|  4 |       3 |      1213 |   10 |
|  5 |       4 |      2222 |   10 |
|  6 |       5 |      9999 |   30 |
|  7 |       5 |      1213 |   30 |
|  8 |       6 |      9999 |   30 |
|  9 |       6 |      1213 |   30 |
+----+---------+-----------+------+
9 rows in set (0.00 sec)

select orders1.*,orders2.*,t.*
from
(select * from
(
select orderid o1orderid,group_concat(productid order by productid) o1grp,sum(qty) qty1
from order_details 
group by orderid
) o1
join
(select orderid o2orderid,group_concat(productid order by productid) o2grp, sum(qty) qty2
from order_details 
group by orderid
) o2
on o2grp = o1grp and qty2 = qty1 and o2orderid > o1orderid
) t
join orders orders1 on t.o1orderid = orders1.id
join orders orders2 on t.o2orderid = orders2.id

возвращается

+------+---------------------+-------------+------+---------------------+-------------+-----------+-----------+-------+-----------+-----------+-------+
| id   | order_created       | customer_id | id   | order_created       | customer_id | o1orderid | o1grp     | qty1  | o2orderid | o2grp     | qty2  |
+------+---------------------+-------------+------+---------------------+-------------+-----------+-----------+-------+-----------+-----------+-------+
|    5 | 2016-02-01 00:00:00 |           2 |    6 | 2016-01-01 00:00:00 |           3 |         5 | 1213,9999 | 30,30 |         6 | 1213,9999 | 30,30 |
+------+---------------------+-------------+------+---------------------+-------------+-----------+-----------+-------+-----------+-----------+-------+
1 row in set (0.03 sec)

Но номер клиента отличается.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню