Mysql 查找其中一个购买了超集产品的所有客户对
我有三个表描述了企业用于管理在线订单的数据库:Mysql 查找其中一个购买了超集产品的所有客户对,mysql,sql,Mysql,Sql,我有三个表描述了企业用于管理在线订单的数据库: orders o_id c_id 1 1 2 1 3 2 4 3 5 3 order_items o_id p_id 1 1 2 2 3 1 3 2 3 8 4 1 4 2 5 8 5 9 customers c_id
orders
o_id c_id
1 1
2 1
3 2
4 3
5 3
order_items
o_id p_id
1 1
2 2
3 1
3 2
3 8
4 1
4 2
5 8
5 9
customers
c_id name
1 Mark
2 Lisa
3 Sean
我想找到所有客户对,其中第二个客户至少购买了第一个客户购买的所有产品。我好像想不出来!我最好的尝试是将orders和order_项目合并为一个表,并将该表与其自身交叉连接,以获得购买相同产品的所有对。我似乎无法从那里减少它
Expected Output
c_id1 c_id2
1 2
1 3
2 3
为此,可以使用自联接。它有助于为每个客户统计产品数量。因此,这定义了一个CTE,该CTE包含该信息以及唯一的客户/产品对:
with ci as (
select c.c_id, o.p_id, count(*) over (partition by c_id) as cnt
from order_items oi join
customers c
on c.o_id = o.o_id
group by c.c_id, o.p_id
)
select ci1.c_id, ci2.c_id
from ci ci1 join
ci ci2
on ci1.p_id = oi2.p_id
group by ci1.c_id, ci2.c_id, ci1.cnt
having count(*) = ci1.cnt;
我有点困惑,因为您使用的是c.o_id,但customers表没有o_id。我在一个更大的集合上尝试了这一点,似乎我得到了不正确的结果@格雷戈里肖特。CTE中的计数错误。我如何更改此值以执行完全相反的操作?就像在查找第二个客户与第一个客户没有任何共同产品的任何一对一样。@GregorySot。这应该作为一个新问题提出。