是否有任何选项可以在不使用临时表或过程的情况下获得一个SQL查询中所有元素的计数组合?

考虑以下三个表:

  • 产品(id,product_name)
  • 交易(id,日期)
  • transaction_has_product(标识,product_id,transaction_id)

  • 样本数据
  • 产品
    1   AAA
    2   BBB
    3   CCC
    
  • 交易
    1   some_date
    2   some_date
    
  • transaction_has_products
    1   1   1
    2   2   1
    3   3   1
    4   1   2
    5   2   2
    

  • 结果应为:
    AAA, BBB = 2
    AAA, CCC = 1
    BBB, CCC = 1
    AAA, BBB, CCC = 1
    

    最佳答案

    这并不容易,因为与其他行相比,最后一行中匹配商品的数量不同。您也许可以使用某种GROUP_CONCAT()运算符(在MySQL中可用;在其他DBMS中实现,例如Informix和PostgreSQL)来实现,但是我对此不太确定。

    成对匹配

    SELECT p1.product_name AS name1, p2.product_name AS name2, COUNT(*)
      FROM (SELECT p.product_name, h.transaction_id
              FROM products AS p
              JOIN transactions_has_products AS h ON h.product_id = p.product_id
           ) AS p1
      JOIN (SELECT p.product_name, h.transaction_id
              FROM products AS p
              JOIN transactions_has_products AS h ON h.product_id = p.product_id
           ) AS p2
        ON p1.transaction_id = p2.transaction_id
       AND p1.product_name   < p2.product_name
     GROUP BY p1.name, p2.name;
    

    处理三重匹配是不平凡的;进一步扩展它绝对是非常困难的。

    关于sql - 如何计算SQL中所有合并的出现次数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4127728/

    10-11 21:09