【问题标题】:How to form a sql query for the following result?如何为以下结果形成一个 sql 查询?
【发布时间】:2019-03-10 21:38:13
【问题描述】:

这是一个示例架构,可用于获得我的结果。

这里,Customer - PurchaseHistory 是 1:N 关系。一个自定义可以有 n 次购买。

PurchaseHistory - 产品 1:1 关系。每次购买仅包含一种产品。

期望的结果:

显示同时购买了 Product1 和 product2 或仅购买 product3 的客户。

样本数据:

客户

购买历史:

产品1

产品2

预期答案:客户 c2,因为他同时购买了 product1 和 product2。

【问题讨论】:

  • 你使用的是 MySQL 还是 Postgresql?
  • 这里的大多数人想要格式化文本,而不是图像(或图像链接)。'
  • 首先,产品 1,2 和 3 是真正的表还是表产品的这些示例元组?在后者中,您可以通过简单地左连接这 3 个表来实现您的目标,然后添加检查 NULL 值的 where 条件。

标签: mysql sql postgresql join subquery


【解决方案1】:

我已经为你写了一个查询。它没有用实际数据进行测试。但我已经写了你的要求。使用并进行一些更改,然后在 mysql 控制台上进行尝试。看看你能不能达到你想要的结果。

select c.name from purchasehistory ph
left join customer c on ph.customerid = c.customer_id
join product1 p1 on ph.purchase_id = p1.purchase_id
join product2 p2 on ph.purchase_id = p2.purchase_id
join prodcut3 p3 on ph.purchase_id = p3.purchase_id
where (p1.purchase_id is not null and p2.purchase_id is not null) 
or p3.purchase_id is not null

【讨论】:

  • product1、2 和 3 的连接应该通过左连接,否则您暗示 p1.purchase_id(以及 p2、p3 以及)始终不为空。
  • 这不起作用,因为购买历史记录的每一行将只匹配三个产品表中的一行。因此,每一行将只包含三个产品表之一的条目,并且应用您的 where 子句将不起作用。
【解决方案2】:
Select customer_id from purchasehistory t
Where (t.purchese_id in (select purchese_id from product1) 
And t.purchese_id in (t.purchese_id in (select purchese_id from product2))
Or t.purchese_id in (t.purchese_id in (select purchese_id from product1)

这会起作用,尽管您的表格方案应该改变,但您不希望每个产品都有一个表格,它适用于 3 种产品的世界,而不是 100 种产品。

【讨论】:

  • 实际上我的架构完全不同,也是企业设计。由于我无法在此处发布该示例,因此我尝试设计一个示例来解决我的查询。
  • 我的问题是,我将有一个暴露的主模块。该主模块中将有子模块。我需要在每个子模块上应用过滤器并逻辑组合这些过滤器以从主模块获取记录。我需要一些模板查询,以便我可以为所有这种相同类型的关系构造。
  • @AravindAshok 在高级过滤器上 - 我建议将所有这些“产品”加入到 1 个查询中,然后将该查询与您的主要数据一起加入。在基本过滤器上,我会使用我在示例中展示的 in 方法
  • 是的,这就是问题所在。如果我加入所有表格,在这种情况下,每个客户行都有多个购买历史记录行。然后我将这个结果与每个产品表连接起来,对每个产品应用一些过滤器作为连接条件。现在,每一行都只有三种产品中的一种的详细信息。我想知道如何根据上述条件仅过滤客户。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多