obj*_*jah 6 sql postgresql combinations
是否有任何选项可以在不使用临时表或过程的情况下获取一个 SQL查询中所有元素的计数组合?
考虑这三个表:
产品(id,product_name)
交易(身份证明,日期)
transaction_has_product(id,product_id,transaction_id)
样本数据
制品
1 AAA
2 BBB
3 CCC
Run Code Online (Sandbox Code Playgroud)交易
1 some_date
2 some_date
Run Code Online (Sandbox Code Playgroud)transaction_has_products
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
Run Code Online (Sandbox Code Playgroud)结果应该是:
AAA, BBB = 2
AAA, CCC = 1
BBB, CCC = 1
AAA, BBB, CCC = 1
Run Code Online (Sandbox Code Playgroud)
这并不容易,因为与其他行相比,最后一行中的匹配产品数量不同。您也许可以使用某种 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;
Run Code Online (Sandbox Code Playgroud)
处理三重匹配并非易事;进一步扩展它肯定是相当困难的。