繁体   English   中英

sql合并两个查询结果

[英]sql merge two queries result

使用xampp mysql
Q1:

SELECT truckid, count(deliveryid) 
  FROM `delivery` 
 WHERE year(deliverydate)=2019 and month(deliverydate)=1 
 GROUP BY truckid

Q2:

 SELECT truckid,count(deliverid) 
   FROM `delivery2` 
  WHERE YEAR(ddate)=2019 and MONTH(ddate)=1 
  GROUP BY truckid

我正在尝试获得4色的一页结果,让我在它们之间进行比较

我上个月已经做完了,我想我使用了左联接,但现在似乎无法使它起作用:(

救命 。

您可以使用union all并进行条件聚合:

select truckid, 
       sum( tbl = 'delivery' ) as delivery_count,
       sum( tbl = 'delivery2' ) as delivery2_count
from (select truckid, deliveryid, 'delivery' as tbl
      from delivery
      where year(deliverydate) = 2019 and month(deliverydate) = 1
      union all
      select truckid, deliverid, 'delivery2'
      from delivery2
      where YEAR(ddate) = 2019 and MONTH(ddate) = 1
     ) t
group by truckid;

您可以通过UNION来模拟FULL OUTER JOIN ,将LEFT JOINRIGHT JOIN ,如下所示:

with
a (truckid, cnt) as ( -- query #1
  SELECT truckid, count(deliveryid)
  FROM delivery
  WHERE year(deliverydate) = 2019 
    and month(deliverydate) = 1 
  group by truckid
),
b (truckid, cnt) as ( -- query #2
  SELECT truckid, count(deliverid) 
  FROM delivery2
  WHERE YEAR(ddate) = 2019 
    and MONTH(ddate) = 1 
  GROUP BY truckid
)
select -- now the full outer join 
from a.truck_id, a.cnt as a_cnt, b.cnt as b_cnt
left join b on a.truck_id = b.truck_id
union
select 
from b.truck_id, a.cnt as a_cnt, b.cnt as b_cnt
right join b on a.truck_id = b.truck_id

我可以这样写:

select truckid, max(delivery1) as delivery1, max(delivery2) as delivery2
from ((select truckid, count(*) as delivery1, 0 as delivery2
       from delivery
       where deliverydate >= '2019-01-01' and deliverydate < '2019-01-02'
       group by truckid
      )
      union all
      (select truckid, 0, count(*) as delivery2
       from delivery2
       where deliverydate >= '2019-01-01' and deliverydate < '2019-01-02'
       group by truckid
      )
     ) t
group by truckid;

我认为这是最有效的方法。

首先,日期范围允许使用索引。

其次,单个表上的group by是较小的数据。 GROUP BY标度比线性标度更差,因此较小的值更好。

UNION ALL也在较小的数据上。

而且,为方便起见,不需要直接使用条件逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM