【问题标题】:MySQL: Comparing records within the same table to each otherMySQL:将同一表中的记录相互比较
【发布时间】:2013-05-17 00:40:51
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: mysql join


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      该结构似乎不利于您要完成的工作,但我想您可以使用 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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        相关资源
        最近更新 更多