最後の行の一致する商品の数が他の行と異なるため、簡単ではありません。ある種のGROUP_CONCAT()演算子(MySQLで利用可能、InformixやおそらくPostgreSQLなどの他のDBMSで実装可能)でそれを実行できるかもしれませんが、私はそれを確信していません。
ペアワイズマッチング
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;
トリプルマッチの処理は簡単ではありません。それ以上に拡張するのは確かにかなり難しいです。