MySQL:将同一个表中的记录相互比较

MySQL:将同一个表中的记录相互比较,mysql,join,Mysql,Join,在表示存储的数据库中,我有下表: table name: CLIENTS_PRODUCTS columns: client_id (INT) product_name (CHAR(256)) 如您所见,每次购买的产品都作为记录存储在表中 给定一个客户机a,我想找到所有客户机X,其中有pA的任何乘积和X pX的任何乘积,使得pA是pX的前缀 简而言之:我需要在同一个表中的不同记录之间执行比较。我想通过加入客户来实现这一点。这条路对吗 我在SO中四处搜索,找不到这个问题的直接答案。该

在表示存储的数据库中,我有下表:

table name: 
  CLIENTS_PRODUCTS
columns:
  client_id (INT)
  product_name (CHAR(256))
如您所见,每次购买的产品都作为记录存储在表中

给定一个客户机a,我想找到所有客户机X,其中有pA的任何乘积和X pX的任何乘积,使得pA是pX的前缀

简而言之:我需要在同一个表中的不同记录之间执行比较。我想通过加入客户来实现这一点。这条路对吗


我在SO中四处搜索,找不到这个问题的直接答案。

该结构似乎对您试图实现的目标没有帮助,但我想您可以使用REGEXP表达式对其进行破解。这可能会很慢,具体取决于表的大小

SELECT DISTINCT prod_parents.client_id 
FROM CLIENTS_PRODUCTS AS products
JOIN CLIENTS_PRODUCTS AS prod_parents ON 
  prod_parents.product_names REGEXP CONCAT("^",products.product_names)
  #AND prod_parents.client_id <> products.client_id
WHERE products.client_id = ? AND products.product_names = ?
如果不希望客户机A与其余部分一起返回,请取消对联接上的和的注释

另一种方法是向表中添加父\u id,如果插入的新行与产品\u名称前缀匹配,则会将该记录的id指定为父\u id。您的应用程序将处理重新设置产品前缀的操作,以便从数据库中删除负载。通过修改上述SP的连接,您将得到一个简单的整数比较。。。在products.id=prod_parents.parent_id

上,此版本假定product_名称包含单个产品,不管列的名称如何:

select distinct cp.client_id
from (select 
      from clients_products cp
      where client_id = A
     ) a join
     client_products cp
     on cp.product_names like concat(a.product_names, '%') and
        cp.client_id <> a.client_id
select distinct cp.client_id
from (select 
      from clients_products cp
      where client_id = A
     ) a join
     client_products cp
     on concat(',', cp.product_names, ',') like concat('%,', a.product_names, '%,%') and
        cp.client_id <> a.client_id