结合我的两个MySQL查询
这是erp。订单:结合我的两个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.
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