Задать вопрос

Как получить из базы данных сущности А, у которых есть общие сущности Б в другой таблице?

Здравствуйте.
Есть три таблицы. Одна - 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 -- отсортируем по количеству общих продуктов в заказе

Более изящного решения мне найти не удалось, но подозреваю, что быть оно просто обязано - хотя бы от двух одинаковых подзапросов хотелось бы избавиться. Собственно, вопрос из, скорее, академического интереса: как?

Заранее спасибо.
  • Вопрос задан
  • 73 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
@TelepnevDmitriy
Senior Web Developer
select o1.*, o2.*
from order_products p1
join order_products p2 on p1.product_id = p2.product_id
    and p1.order_id != p2.product._id
join orders o1 on o1.id = p1.order_id
join orders o2 on o2.id = p2.order_id


ЗЫ за подсветку синтаксиса простите - я с телефона)

UPD отформатировал
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы