SQL объединить два запроса результат - PullRequest
0 голосов
/ 18 марта 2019

с использованием 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 столбцами, что позволит мне сравнить между ними

Я уже делал это в прошлом месяце, я думаю, что использовал левое соединение, но я не могу заставить его работать сейчас: (

справка.

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Вы можете использовать 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;
0 голосов
/ 18 марта 2019

Я бы написал так:

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 также для меньших данных.

И для удобства прямая условная логика не требуется.

0 голосов
/ 18 марта 2019

Вы можете смоделировать FULL OUTER JOIN с помощью UNION -ing a LEFT JOIN с RIGHT 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...