如果同时购买了两件商品,请选择 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的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 SQL 查询数据仓库事实表

python入门之实例-购买商品

python写的简单购物车

购物车和用户交互,显示省市县三级联动的选择

批量购买时选择的同时显示合计数

购物车练习