Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 28.09.2018 08:58:02

Как найти дублирующиеся подряд записи по признаку?

Добрый день,

Есть такая структура таблицы orders
id
user_id
product_id

Записи:

id       user_id         product_id
1        1               2
2        2               2
3        2               3
4        2               4
5        1               2
6        1               5
7        1               5
8        1               5

Нужно, чтобы заселектились записи только те, в которых предыдущие записи с такими же user_id имеют эквивалентный product_id.

Т.е. в данном случае вытащатся только с id 7 и 8


Есть 2 не совсем рабочих варианта:

1) Возвращает нужные записи с дубликатами, а дубликаты не нужны.

select * from your_table
INNER JOIN   (
      SELECT user_id, product_id
     FROM your_table
     GROUP BY user_id, product_id
    HAVING COUNT(id) > 1
) as m ON m.user_id = your_table.user_id AND m.product_id = your_table.product_id

2) Возвращает все, у которых были раннее эквивалентные записи, но тут не соблюдается, что запись для текущего пользователя по условию должна быть предыдущей.

SELECT 
  id 
FROM 
  orders outerO 
WHERE 
  EXISTS (
    SELECT 
      * 
    FROM 
      orders innerO 
    WHERE 
      innerO.user_id = outerO.user_id 
      AND innerO.product_id = outerO.product_id 
      AND innerO.id < outerO.id
  );

Подскажите - как решить мою проблему?

Не в сети

#2 30.09.2018 22:20:12

Re: Как найти дублирующиеся подряд записи по признаку?

Есть такая структура таблицы orders

Довольно странная структура, "заказ" обычно это набор товаров, а здесь получается, что "заказов" нет, но есть запись "id товара" на каждого пользователя (а не на каждый заказ!).

Нужно, чтобы заселектились записи только те, в которых предыдущие записи с такими же user_id имеют эквивалентный product_id.

В СУБД как такового нет порядка строк, и уж тем более нельзя производить операции над строками в зависимости от их порядка (т.е. "выбрать если предыдущая строка ..."). Для этого вводится новое поле и используется GROUP BY.

То есть если бы в orders, как это обычно бывает, был бы id заказа (order_id), то задача решается простым SELECT ... GROUP BY order_id, без подзапросов и прочих трюков.

Не в сети

Подвал раздела