结合我的两个MySQL查询

结合我的两个MySQL查询,mysql,sql,Mysql,Sql,这是erp。订单: userId paidAt 1 2017-06-30 1 2017-06-18 2 2017-06-07 4 2017-06-07 3 2017-01-01 2 2017-01-01 2 2017-01-01 2 2017-01-01 这是产品转介\订单\交付 user_id 1 2 1 1 1 我需要合并两个请求 本请求: SELECT DISTINCT erp.

这是erp。订单:

userId  paidAt
1       2017-06-30
1       2017-06-18
2       2017-06-07
4       2017-06-07
3       2017-01-01
2       2017-01-01
2       2017-01-01
2       2017-01-01
这是产品转介\订单\交付

user_id
1
2
1
1
1
我需要合并两个请求

本请求:

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;
这项请求:

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
现在,我想合并这些请求以获得以下结果:

userId  countorders
1           2
2           4
user_id    countreferral
1          4
2          1 
userId  countorders countreferral
1       2           4
2       4           1
请注意,userId和userId是相同的。所以这是用户id还是出现的用户id并不重要


您可以测试解决方案。

考虑将两个聚合查询作为派生表连接起来。首先,将子句查询中的
(两者都等效于前者使用隐式连接,后者使用显式连接)转换为
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

在其他RDBMS(如Postgres)中,您可以使用CTE的
WITH()
避免重复。请参阅您最初设置的forked。

不错,但请注意,即使在我阅读您给我的帖子时,我也不知道如何更好地提问。请你自己告诉我,以便我改进。你如何用这种非常好的方式格式化你的查询?你是手工做的吗?太好了!很乐意帮忙。我只是用换行符和空格手动设置格式,尝试组织子句以提高可读性:
选择
加入
其中
分组依据
。并缩进任何子查询。
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