如果同时购买了两件商品,请选择 orderId
Posted
技术标签:
【中文标题】如果同时购买了两件商品,请选择 orderId【英文标题】:Select orderId if it has both items bought 【发布时间】:2013-11-05 19:28:25 【问题描述】:我有两个表的一个很常见的情况:“Orders”放置和每个订单的“ItemsBought”:
Orders: orderId, orderDate, [...]
ItemsBought: boughtId, orderId, itemId, [...]
订单可以有一个或多个 ItemsBought。现在,我只想选择那些用户同时购买了 itemId=1 和 itemId=2 的订单。
说,我们在 ItemsBought 表中有这样的数据:
boughtId | orderId | itemId
---------------------------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 2 | 1
5 | 2 | 3
6 | 2 | 4
我只需要查询返回:
orderId
-------
1
Access 2010 中的 SQL 代码是什么?
【问题讨论】:
您必须更具体地了解您的要求。在什么条件下你想要它,你想要在输出查询中做什么?只是 orderId = 1? 我需要查询以返回 orderId 列表。我打算在子查询中使用它。SELECT orderId FROM ItemsBought
?
这只是一次性的,还是需要足够通用才能适用于任何输入?
我打算对其进行参数化并将其包含在复杂查询的 WHERE 子句中作为子查询。我只是不知道如何在同一个字段上设置 whereclause 两次(三次等)。
【参考方案1】:
试试这样的:
SELECT orderId
FROM ItemsBought
WHERE itemId IN (1,2)
GROUP BY orderId
HAVING COUNT(orderId) = 2;
只有在同一个 orderid 中不能有多个项目 1 或 2 时,这才有效。
sqlfiddle demo
【讨论】:
是的,这就是我需要的代码。简单而优雅。非常感谢!【参考方案2】:我很肯定有一种更有效的方法可以做到这一点,但这里有一个简单的解决方案。基本上只需对两个单独的子查询进行内部连接,这些子查询会拉回您想要的行。
结果将是两个集合之间的交集,或者换句话说,是同时找到这两个项目的那些订单。
Select orderId
From
(
Select orderId
From Orders o
Inner Join ItemsBought i on o.orderID = i.orderID
Where itemId = 1) qry1
Inner Join
(Select orderId
From Orders o
Inner Join ItemsBought i on o.orderID = i.orderID
Where itemId = 2) qr2 on qry1.orderID = qry2.orderId
Group By orderId
【讨论】:
【参考方案3】:这是集合中集合查询的示例。您可以使用聚合和having
子句来做到这一点。这是 MS Access 版本:
select orderId
from ItemsBought ib
where itemId in (1, 2)
group by orderId
having sum(iif(itemId = 1, 1, 0)) > 0 and
sum(iif(itemId = 2, 1, 0)) > 0;
having
子句计算匹配“1”的项目数和匹配“2”的项目数。这两个都必须大于 0 才能满足您的条件。
【讨论】:
HAVING Min(itemId = 1) + Min(itemId = 2) = -2
会起作用吗? (不过我知道这会有点神奇)以上是关于如果同时购买了两件商品,请选择 orderId的主要内容,如果未能解决你的问题,请参考以下文章