Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查找其中一个购买了超集产品的所有客户对_Mysql_Sql - Fatal编程技术网

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。这应该作为一个新问题提出。