【问题标题】:Two Select statements into one两个 Select 语句合二为一
【发布时间】:2021-07-09 11:59:05
【问题描述】:

我使用的是 MySql 8.0.23 并且有两个 select 语句。第一个是这样的:

SELECT w.userid,w.reportdate, t.teamname, sum(w.worked)/60 as Worked FROM apticproject.view_workedtime as w
inner join user u on u.userid=w.userid
left outer join teammembers m on m.member=w.userid
left outer join teams t on t.teamid=m.team
where reportdate >= '2021-03-01' and reportdate <'2021-04-01'
group by w.userid
order by fullname ;

并给出以下输出:

第二个 select 语句如下所示:

SELECT r.userid, sum(r.invoicetime)/60 as invoicetime FROM apticproject.view_registeredtime as r
inner join user u on u.userid=r.userid 
left join teammembers m on m.member=r.userid
left join teams t on t.teamid=m.team
where fromdate >= '2021-03-01' and fromdate <'2021-04-01' and r.invoiced=1 and r.approved=1 and charge_customer=1 and r.zeroinvoice=0 
group by userid
order by fullname;

并给出以下输出:

我希望能够将 invoicetime 列从第二个 select 语句连接到第一个 select 语句,以便 invoicetime 列显示在第一个 select 语句中的 Worked 列之后。如您所见,我有可用作连接点的用户 ID。最有效的方法是什么?非常感谢您的帮助。

【问题讨论】:

  • 将您的查询用作子查询,按公共列连接。
  • edit 提及您使用的 MySQL / MariaDB 版本。使用 v8+,这些查询更容易编写,因为它们有 common table expressions
  • @O.Jones,它已更新

标签: mysql sql join select subquery


【解决方案1】:

我设法找到了如下所示的解决方案。在 MySQL 中你没有 FULL JOIN,只有 Union 存在,这是我使用的语法:

select x.userid, x.username, x.fullname,x.reportdate, x.teamname, x.Worked,y.invoicetime
from
(SELECT w.userid, u.username, u.fullname,w.reportdate, t.teamname, sum(w.worked)/60 as Worked FROM apticproject.view_workedtime as w
inner join user u on u.userid=w.userid
left outer join teammembers m on m.member=w.userid
left outer join teams t on t.teamid=m.team
where reportdate >= '2021-03-01' and reportdate <'2021-04-01'
group by w.userid) as x

left join

(SELECT r.userid, sum(r.invoicetime)/60 as invoicetime FROM apticproject.view_registeredtime as r
inner join user u on u.userid=r.userid 
left join teammembers m on m.member=r.userid
left join teams t on t.teamid=m.team
where fromdate >= '2021-03-01' and fromdate <'2021-04-01' and r.invoiced=1 and r.approved=1 and charge_customer=1 and r.zeroinvoice=0 
group by userid) as y on y.userid=x.userid

Union

select x.userid, x.username, x.fullname,x.reportdate, x.teamname, x.Worked,y.invoicetime
from
(SELECT w.userid, u.username, u.fullname,w.reportdate, t.teamname, sum(w.worked)/60 as Worked FROM apticproject.view_workedtime as w
inner join user u on u.userid=w.userid
left outer join teammembers m on m.member=w.userid
left outer join teams t on t.teamid=m.team
where reportdate >= '2021-03-01' and reportdate <'2021-04-01'
group by w.userid) as x

right join

(SELECT r.userid, sum(r.invoicetime)/60 as invoicetime FROM apticproject.view_registeredtime as r
inner join user u on u.userid=r.userid 
left join teammembers m on m.member=r.userid
left join teams t on t.teamid=m.team
where fromdate >= '2021-03-01' and fromdate <'2021-04-01' and r.invoiced=1 and r.approved=1 and charge_customer=1 and r.zeroinvoice=0 
group by userid) as y on y.userid=x.userid
order by fullname; 

【讨论】:

    【解决方案2】:

    如果您不希望在第二个查询中看到第一个没有用户记录的项目,您可以在 Darko86 答案的后半部分删除联合和整个右连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2011-08-22
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多