MYSQL使用join

时间:2018-03-19 12:02:20

标签: mysql inner-join

我正在查询3个表,并且可以使用对每个表的单个查询来提取正确的数据,当我将它们放在连接语句中时,返回的结果会有所不同。

查询:

select advisor, round(sum(shift),1) AS avail_time from shift_track
where date >= 20180319
group by advisor order by advisor ASC

select advisor, round(sum(time/60),1) AS standard_time from shift_report
where date >= 20180319
group by advisor order by advisor ASC

select advisor, round(sum(time/60),1) AS mobile_time from sr_mobile
where date >= 20180319
group by advisor order by advisor ASC

加入我正在尝试:

SELECT shift_track.advisor, shift_track.date, sum(shift_track.shift) AS 
avail_time, 
sum(shift_report.time/60) AS stand_time,
sum(sr_mobile.time/60) AS mobile_time
from shift_track
inner join shift_report on shift_report.advisor=shift_track.advisor
inner join sr_mobile on sr_mobile.advisor=shift_track.advisor
where shift_track.date =20180319
group BY shift_track.advisor ORDER BY shift_track.advisor ASC

我正试图在给定日期从每张桌子中获取顾问的总时间。加入查询似乎跟随堆栈中的其他人。

另一种方法是在PHP中使用单独的查询,然后将结果添加到要显示的表中 - 但我确信我应该能够在单个查询中执行此操作吗?

任何帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

使用union all

select advisor, sum(avail_time) as avail_time, 
       sum(standard_time) as standard_time, 
       sum(mobile_time) as mobile_time
from ((select advisor, sum(shift) AS avail_time, NULL as standard_time, NULL as mobile_time
       from shift_track
       where date >= 20180319
       group by advisor
      ) union all
      (select advisor, NULL, sum(time/60) AS standard_time, NULL
       from shift_report
       where date >= 20180319
       group by advisor
      ) union all
      (select advisor, NULL, NULL, sum(time/60) AS mobile_time
       from sr_mobile
       where date >= 20180319
       group by advisor
      )
     ) t
group by advisor
order by advisor;

如果您知道所有顾问都在所有三个表中,那么您可以使用join。但是,这可以保证所有顾问都在结果中。