【问题标题】:How to get duplicate results in two or more joined tables?如何在两个或多个连接表中获得重复的结果?
【发布时间】:2011-08-09 09:34:21
【问题描述】:

我有两张桌子:

  1. 订单(id);
  2. order_items(id, order_id, item_id, 数量)

假设我已经选择了一个包含 3 个不同项目(A - 1 个单元、B - 2 个单元和 C - 1 个单元)的订单 X。

我需要获得所有具有相同物品和完全相同数量的物品的订单(在这种情况下:A - 1 个单位,B - 2 个单位和 C - 1 个单位,不多也不少 :)),不包括订单 X。

我做了一个测试表的转储,所以,我希望,因为你会更容易理解,我想得到什么:) http://nopaste.info/44eb93ae3d.html

假设订单 X = 1,因此所需的输出将只有订单 2,因为订单 3 只有一件商品,订单 4 与 #1 有相同的商品,但它还有一件额外的商品,所以不好:)

【问题讨论】:

  • 如果订单中的商品与 X 相同,甚至更多,该怎么办?

标签: mysql sql duplicates


【解决方案1】:

统计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 表的键。

I have made a sample test here.

【讨论】:

  • 出现小语法错误。我修改了这部分:COUNT(CASE WHEN i2.order_id = 'X' THEN 1 ELSE 0 END),然后它返回一些订单,这些订单至少有一个相同的订单 X。这不是我想要的喜欢得到。顺便说一句,在结果中,也有一些正确选择的订单:)
  • 你说得对,我忘记了 CASE 的“END”。如果您想要替代方案,请执行 COUNT(CASE WHEN i2.order_id = 'X' THEN 1 ELSE NULL END) 或 SUM(CASE WHEN i2.order_id = 'X' THEN 1 ELSE 0 END)。否则计数也会计数为 0。
  • 谢谢,但如果我像您建议的那样修改查询,我根本得不到任何结果。这里出了点问题 :) 我执行了 MyResult 部分,发现 numberOfSameOrder 的计数不正确(它计算相同项目的数量,但不是按顺序计算的所有项目)并且 numberOfOrderX 的结果仅在 X 顺序中 > 0,所以“where”子句不能工作,恕我直言:)
【解决方案2】:
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

编辑:

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

【讨论】:

  • 这里相同,我得到的结果与 Scopri0 的查询完全相同。这些查询得到的订单至少有一个相同的商品 X。这是错误的
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
相关资源
最近更新 更多