Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Добрый день,
Есть такая структура таблицы 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
);
Подскажите - как решить мою проблему?
Не в сети
Есть такая структура таблицы orders
Довольно странная структура, "заказ" обычно это набор товаров, а здесь получается, что "заказов" нет, но есть запись "id товара" на каждого пользователя (а не на каждый заказ!).
Нужно, чтобы заселектились записи только те, в которых предыдущие записи с такими же user_id имеют эквивалентный product_id.
В СУБД как такового нет порядка строк, и уж тем более нельзя производить операции над строками в зависимости от их порядка (т.е. "выбрать если предыдущая строка ..."). Для этого вводится новое поле и используется GROUP BY.
То есть если бы в orders, как это обычно бывает, был бы id заказа (order_id), то задача решается простым SELECT ... GROUP BY order_id, без подзапросов и прочих трюков.
Не в сети