Как получить повторяющиеся результаты в двух или более соединенных таблицах? - PullRequest
1 голос
/ 09 августа 2011

У меня есть две таблицы:

  1. заказов (id);
  2. order_items (id, идентификатор_порта, item_id, количество)

Допустим, я уже выбрал ордер X с 3 разными предметами (единица A - 1, единица B - 2 и единица C - 1).

Мне нужно получить все заказы, которые имеют одинаковые предметы и одинаковое количество предметов (в данном случае: A - 1 единица, B - 2 единицы и C - 1 единица и не больше или не меньше :)), без учета заказа X.

я сделал дамп тестовых таблиц, так что, надеюсь, вам будет проще понять, что я хотел бы получить :) http://nopaste.info/44eb93ae3d.html

давайте предположим, что порядок X = 1, поэтому желаемым результатом будет только порядок 2, потому что в заказе 3 есть только один элемент, а в порядке 4 - те же элементы, что и в # 1, но также есть один дополнительный элемент, так что это не хорошо :)

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Подсчитайте одинаковые вхождения каждого заказа в таблице order_items, а затем сравните с номером элемента в искомом заказе:

SELECT i2.order_id
FROM order_items i1
    RIGHT OUTER JOIN order_items i2
        ON i2.item_id = i1.item_id 
        AND i2.quantity = i1.quantity
        AND i1.order_id = 1
WHERE i2.order_id  != 1
GROUP BY i2.order_id
HAVING COUNT(i1.order_id) = COUNT(*)
   AND COUNT(i1.order_id) = (SELECT COUNT(*) FROM order_items WHERE order_id = 1)

Обратите внимание, что в этом запросе предполагается, что (order_id, item_id) является ключомorder_items таблица.

Я провел здесь пробный тест.

0 голосов
/ 09 августа 2011
select *
from orders o
JOIN order_items oi ON o.id = oi.order_id
JOIN (select *
      from orders o2
      JOIN order_items oi2 ON o2.id = oi2.order_id
      WHERE o2.id = @X) sub
ON oi.quantity = sub.quantity
AND oi.item_id = sub.item_id
WHERE o.id <> @X

EDIT:

select *
from orders o
JOIN order_items oi ON o.id = oi.order_id
JOIN (select *
      from orders o2
      JOIN order_items oi2 ON o2.id = oi2.order_id
      WHERE o2.id = @X) sub
ON oi.quantity = sub.quantity
AND oi.item_id = sub.item_id
AND NOT EXISTS (select 1 
                from order_items 
                where order_id = o.id 
                and concat(item_id,quantity) not in (select concat(itemid,quantity)
                                                     from order_items
                                                     where order_id = o.id))
WHERE o.id <> @X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...