Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中左连接三个表,其中两个表上有内部连接_Mysql_Sql - Fatal编程技术网

在mysql中左连接三个表,其中两个表上有内部连接

在mysql中左连接三个表,其中两个表上有内部连接,mysql,sql,Mysql,Sql,我有五张桌子 tableevents eventname eventid openingdate eventtype alpha 2222 2019-08-07 44 beta 22299 2019-08-09 48 gama 24555 2019-06-9 47 tablesectora eventid resultstatus liability userid profitsectora tablesectorb event

我有五张桌子

tableevents

eventname eventid openingdate eventtype
alpha      2222    2019-08-07  44
beta      22299    2019-08-09  48
gama      24555    2019-06-9   47

tablesectora

eventid resultstatus liability userid  profitsectora

tablesectorb

eventid resultstatus liability userid    profitsectorb

tablesectorc

eventid resultstatus liability userid    profitsectorc

users

userid registrar_id 
io      manager
co      manager
我想我要找的是雷吉斯塔(经理)的以下事情

1-如果有任何用户id(其注册表id为 manager)在三个或两个表中的一个或所有表中都有数据tablesectora、tablesectorb和 TableSector(三个表可以具有相同的eventid,并且不能具有相同的 eventid)2-还显示eventname和、eventid和开始日期

选择不同的tl.eventid eventid,ul.resultstatus
resultstatus,ce.eventname eventname,ce.opendate opendate,ce.eventtypeid
用户u,tablesectora tl left join tablesectorb uf on
uf.eventid=tl.eventid left join tablesectorc ul on ul.eventid=tl.eventid
ce.eventid=ul.eventid和u.userid=tl.userid,其中u.registar\u id='manager'

查询正在运行,但我无法获得预期的输出

预期产出应为

如果只有TableSector有数据

表科特拉

eventid resultstatus liability userid  profitsectora 
2222       complted   2000      io       20000   
eventid resultstatus liability userid  profitsectora 
2222       complted   2000      io       20000  
输出

如果表A和表b都有数据

表科特拉

eventid resultstatus liability userid  profitsectora 
2222       complted   2000      io       20000   
eventid resultstatus liability userid  profitsectora 
2222       complted   2000      io       20000  
表扇区

eventid resultstatus liability userid  profitsectorb
2222       complted   200000     io       200000 
22299      completed  555666     co       56666 
输出

你看,我只想要累计的eventid、eventname、eventtype 以及resultstatus(resultstatus将与中的evenry eventid相同) 每张桌子


您应该在子查询上使用DISTINCT和UNION语句来实现这一点:

SELECT DISTINCT eventname
      ,eventid 
      ,openingdate 
      ,resultstatus  
      ,eventtype
FROM (SELECT eventname
          ,A.eventid 
          ,openingdate 
          ,resultstatus  
          ,eventtype
        FROM  tableevents A
        INNER JOIN tablescorea B
        ON    A.eventid = B.eventid
        INNER JOIN users C
        ON C.userid = A.userid
      UNION SELECT DISTINCT eventname
          ,A.eventid 
          ,openingdate 
          ,resultstatus  
          ,eventtype
      FROM  tableevents A
      INNER JOIN tablescoreb B
      ON    A.eventid = B.eventid
      INNER JOIN users C
        ON C.userid = A.userid
      )

事件发生在三个扇区表中的哪一个并不重要。因此,您可以通过使用
UNION ALL
将这些表粘合在一起来将它们视为一个(在我看来,它甚至看起来像是一个糟糕的数据模型,您应该有一个带有扇区类型列的表,而不是每个扇区一个表。)

将三个表的行粘在一起,限制为管理器,聚合事件ID和联接

select e.eventname, e.eventid, e.openingdate, e.eventtype, s.resultstatus
from tableevents e
join
(
  select eventid, max(resultstatus) as resultstatus
  from
  (
    select eventid, resultstatus, userid from tablesectora
    union all
    select eventid, resultstatus, userid from tablesectorb
    union all
    select eventid, resultstatus, userid from tablesectorc
  ) glued
  where userid in (select userid from users where registrar_id = 'manager')
  group by eventid
) s on s.eventid = e.eventid
order by e.eventid;

但是我也想加入users表,以便将Registrand作为manager传递。@ron我已经添加了users表,它不会改变逻辑。我不明白的一点是,
resultstatus
。这三个表都有一个
resultstatus
,您想在结果中显示
resultstatus
。但是如果有多行,您可以获取各种
resultstatus
。如果表A显示
resultstatus'Completed'
,表B显示
resultstatus'Completed'
,结果中会显示什么?或者您正在查看带有“resultstatus='Completed'”的行吗?不,如果eventid相同,则情况并非如此,那么所有三个表中的resultstatus将相同@ThorstenKettnerOkay。这听起来像是一个糟糕的数据模型,但它让它变得简单。我将发布一个答案。它会抛出错误,
在“管理器”附近的sql语法中出现错误(错误消息很奇怪。首先它应该读
“管理器”
,而不是
“管理器”
,因为我们在这里处理字符串文字。然后,我缺少子查询的别名,这是必须的。但是错误消息应该是
“每个派生表都必须有自己的别名”
。无论如何,我添加了一个别名。请重试。