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

时间:2013-05-17 00:40:51

标签: mysql join

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

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

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

鉴于客户A,我想找到所有客户X,其中有任何A(pA)产品和X(pX)的任何产品,使得pA是pX的前缀。

简而言之:我需要在同一个表中的不同记录之间执行比较。我想通过JOIN CLIENTS_PRODUCTS本身来做这件事。这是正确的方法吗?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

,你将得到一个简单的整数比较。