结合我的两个MySQL查询

时间:2017-07-08 21:44:20

标签: mysql sql

这是erp.orders:

user_id
1
2
1
1
1

这是prod.referral_order_delivered

SELECT DISTINCT 
    erp.orders.userid, COUNT(erp.orders.userid) as countorders
FROM 
    erp.orders
WHERE 
    erp.orders.userid IN (SELECT erp.orders.userid
                          FROM erp.orders, prod.referral_order_delivered
                          WHERE erp.orders.userid = prod.referral_order_delivered.user_id
                            AND erp.orders.paidat::date >= '2017-06-07'
                            AND erp.orders.paidat::date <= '2017-07-07')
GROUP BY 
    erp.orders.userid;

我需要结合两个请求。

此请求:

userId  countorders
1           2
2           4

返回此结果:

SELECT 
    prod.referral_order_delivered.user_id,
    COUNT(prod.referral_order_delivered.user_id) AS countreferral
FROM 
    prod.referral_order_delivered
WHERE 
    prod.referral_order_delivered.user_id IN (SELECT DISTINCT erp.orders.userid
                                              FROM erp.orders
                                              INNER JOIN prod.referral_order_delivered ON erp.orders.userid = prod.referral_order_delivered.user_id
                                              WHERE erp.orders.paidat >= '2017-06-07'
                                                AND erp.orders.paidat <= '2017-07-07')
GROUP BY 
    prod.referral_order_delivered.user_id

这个要求:

user_id    countreferral
1          4
2          1 

返回此结果:

userId  countorders countreferral
1       2           4
2       4           1

现在我想结合这些请求来获得这个结果:

{{1}}

请注意,user_id和userId是一回事。因此,如果出现user_id或userId并不重要。

您可以测试解决方案here

1 个答案:

答案 0 :(得分:1)

考虑将两个聚合查询作为派生表加入。首先,将IN子句查询(两者都与前者使用隐式连接,后者使用显式连接)转换为JOIN子句。然后,运行相同的聚合,外部查询连接两者并选择列。

SELECT agg1.userid, agg1.countorders, agg2.countreferral
FROM
   (SELECT j.userid, COUNT(j.userid) as countorders
    FROM
        (SELECT DISTINCT erp.orders.userid
         FROM erp.orders
         INNER JOIN prod.referral_order_delivered 
             ON erp.orders.userid = prod.referral_order_delivered.user_id
         WHERE erp.orders.paidat >= '2017-06-07'
           AND erp.orders.paidat <= '2017-07-07') j

    INNER JOIN erp.orders e ON j.userid = e.userid
    GROUP BY j.userid) agg1

INNER JOIN   
   (SELECT j.userid, COUNT(j.userid) as countreferral
    FROM
        (SELECT DISTINCT erp.orders.userid
         FROM erp.orders
         INNER JOIN prod.referral_order_delivered 
             ON erp.orders.userid = prod.referral_order_delivered.user_id
         WHERE erp.orders.paidat >= '2017-06-07'
           AND erp.orders.paidat <= '2017-07-07') j

    INNER JOIN prod.referral_order_delivered p ON j.userid = p.user_id
    GROUP BY j.userid) agg2

ON agg1.userid = agg2.userid

甚至将两个聚合源中使用的嵌套内部查询保存为view

SELECT agg1.userid, agg1.countorders, agg2.countreferral
FROM
   (SELECT v.userid, COUNT(j.userid) as countorders
    FROM myview v           
    INNER JOIN erp.orders e ON v.userid = e.userid
    GROUP BY v.userid) agg1

INNER JOIN   
   (SELECT v.userid, COUNT(j.userid) as countreferral
    FROM myview v         
    INNER JOIN prod.referral_order_delivered p ON v.userid = p.user_id
    GROUP BY v.userid) agg2

ON agg1.userid = agg2.userid

在其他RDBMS中,如Postgres与MySQL不同,您可以使用CTE&#39; WITH()来避免重复。请参阅初始设置中的rextester demo