根据购买的产品过滤客户

时间:2018-08-29 10:52:51

标签: mysql sql jpql

我有3张桌子:

  • 客户(PK:customer_id)
  • customer_order(PK:order_id,FK:customer_id,product_id)
  • 产品(PK:product_id)

customer_order行包含一个客户和该客户在该订单中购买的产品。

现在,对于管理系统,我必须输入产品列表,并找到已购买所有这些产品(包括)的客户列表。包容性是指所有被过滤的客户都必须购买了所有产品。

注意事项:

  • 每个回头客可能都购买了更多产品。 (输入的产品列表可能是其中的一部分)
  • 作为输入发送的产品数量可能会有所不同
  • 我正在尝试用JPQL编写。

在mysql中,我使用customer_order表中的类似方法进行工作:

select customer_id from  (SELECT count(distinct (product_id)) as prodcount, customer_id FROM customer_order where product_id = :prod_id1 or product_id = :prod_id2 group by customer_id) as temp where temp.prodcount= 2;

此处product_id的数目是可变的:prod_id1,prod_id2,prod_id3等。在temp.prodcount= 2中,“ 2”是作为输入的乘积。

在通过输入产品列表(where子句)过滤订单后,我正在计算customer_order表中客户购买的产品的不同数量。然后将计数与输入的产品数量进行比较。如果它们相等,则表示这是购买了所有输入产品的客户

我不确定这是否是正确的方法,因为它看起来更像是黑客。此外,我需要用JPQL编写。因此,JPQL解决方案将有所帮助。

1 个答案:

答案 0 :(得分:2)

您的方法很好,但是您可以通过删除子查询并使用in来简化查询:

select co.customer_id 
from customer_order co
where co.product_id in (:prod_id1, :prod_id2)
group by co.customer_id
having count(distinct product_id) = 2;