Здравствуйте.
Есть три таблицы. Одна - Orders с заказами, другая - Products с продуктами, третья - OrdersProducts - содержит id заказа и id продукта в заказе. Соответственно, нужно получить заказы из таблицы Orders, у которых есть общие продукты между собой (т.е. все строки, где orders1.order_id = orders2.order_id).
Я решил это довольно уродливым и, как мне подсказывает интуиция, неэффективным способом.
тыкSELECT
products_by_orders1.order_number as n1,
products_by_orders2.order_number as n2,
COUNT(*) as count
FROM
(
SELECT DISTINCT orders.order_number, orders_products.product_id FROM products
INNER JOIN orders_products
ON orders_products.product_id = products.id
INNER JOIN orders
ON orders_products.order_id = orders.id
)
as products_by_orders1
INNER JOIN
(
SELECT DISTINCT orders.order_number, orders_products.product_id FROM products
INNER JOIN orders_products
ON orders_products.product_id = products.id
INNER JOIN orders
ON orders_products.order_id = orders.id
)
as products_by_orders2
ON products_by_orders1.product_id = products_by_orders2.product_id
WHERE products_by_orders1.order_number <> products_by_orders2.order_number
GROUP BY products_by_orders1.order_number, products_by_orders2.order_number
ORDER BY count DESC -- отсортируем по количеству общих продуктов в заказе
Более изящного решения мне найти не удалось, но подозреваю, что быть оно просто обязано - хотя бы от двух одинаковых подзапросов хотелось бы избавиться. Собственно, вопрос из, скорее, академического интереса: как?
Заранее спасибо.