Если одну и ту же таблицу необходимо использовать в запросе несколько раз, то необходимо воспользоваться псевдонимами для таблиц. Например, для каждой стоимости товара в магазине найдем предложение на такой же товар в другом магазине по меньшей цене:
SELECT pp.product_id,
pp.store_id,
pp.price,
ppl.store_id AS store_id_less,
ppl.price AS price_less
FROM product_price pp
JOIN product_price ppl
ON ppl.product_id = pp.product_id
AND ppl.store_id != pp.store_id
AND ppl.price < pp.price
ORDER BY pp.product_id,
pp.store_id,
ppl.store_id,
ppl.price
product_id | store_id | price | store_id_less | price_less |
---|---|---|---|---|
1 | 301 | 12500.00 | 300 | 10500.00 |
1 | 301 | 12500.00 | 800 | 12000.00 |
1 | 800 | 12000.00 | 300 | 10500.00 |
2 | 600 | 27500.00 | 500 | 26100.00 |
3 | 201 | 22900.00 | 500 | 22000.00 |
3 | 201 | 22900.00 | 800 | 22100.00 |
3 | 800 | 22100.00 | 500 | 22000.00 |
Разберемся, как это работает:
- Берутся все строки из таблицы
product_price
. Дальнейшее обращение к этому набору строк происходит черезpp
. - Для каждой строки из пункта 1 просматривается еще раз все строки таблицы
product_price
. Обращение к строкам последней происходит черезppl
. - Если цена
price
у строки из второй копииproduct_price
меньше, чем у строки из первой копииproduct_price
, то связка этих строк добавляется в результат выполнения запроса. - В конце результат сортируется согласно
ORDER BY
.