0

在代表商店的数据库中,我有下表:

table name: 
  CLIENTS_PRODUCTS
columns:
  client_id (INT)
  product_name (CHAR(256))

如您所见,每个产品购买都作为记录存储在表中。

给定客户端 A,我想找到所有客户端 X,其中存在 A (pA) 的任何乘积和 X (pX) 的任何乘积,使得 pA 是 pX 的前缀。

简而言之:我需要在同一个表中的不同记录之间进行比较。我想通过JOINing CLIENTS_PRODUCTS 来做到这一点。这是正确的方法吗?

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

4

2 回答 2

1

此版本假定product_names包含单个产品(尽管列的名称):

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

如果product_names真的是逗号分隔的产品列表,那么我们可以将其修改为:

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
于 2013-05-17T01:46:19.317 回答
0

该结构似乎不利于您要完成的工作,但我想您可以使用 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 与其余部分一起返回,请取消注释 JOIN 上的 AND。

另一种方法是将 parent_id 添加到表中,并且如果正在插入与 product_names 前缀匹配的新行,则会将该记录的 id 分配为 parent_id。您的应用程序将处理产品前缀的正则表达式,以便从数据库中移除负载。通过修改上述 SP 的 JOIN ... ON products.id=prod_parents.parent_id,您将得到一个简单的整数比较

于 2013-05-17T01:39:20.883 回答