Левое объединение трех таблиц с внутренним объединением на двух в mysql - PullRequest
0 голосов
/ 04 марта 2019

У меня есть пять таблиц

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

я ищу следующую вещь для regsitar_id предположим (менеджер)

1 - показать данные в панели управления менеджера, если есть идентификатор пользователя (чейid регистратора является менеджером) имеет данные в одной из трех или в двух или во всех таблицах tablesectora, tablesectorb и tablesectorc (три таблицы могут иметь одинаковый Eventid и не могут иметь одинаковый Eventid) 2- также отображать имя события, Eventid и дату открытия

SELECT distinct tl.eventid eventid ,ul.resultstatus resultstatus,ce.eventname eventname,ce.opendate opendate,ce.eventtypeid eventtypeid ,u.registrar_id from users u, tablesectora tl left join tablesectorb uf on uf.eventid=tl.eventid left join tablesectorc ul on ul.eventid=tl.eventid left join tableevents ce on ce.eventid=ul.eventid and u.userid=tl.userid and where u.registar_id='manager'

Запрос работает, но я не могу получить ожидаемый результат

Ожидаемый результат должен составлять

, если данные есть только у tablesectora

tablesectora

eventid resultstatus liability userid  profitsectora 
2222       complted   2000      io       20000   

Output

eventname eventid openingdate resultstatus  eventtype
alpha      2222    2019-08-07  completed     44

если tablesectora и b оба имеют данные

tablesectora

eventid resultstatus liability userid  profitsectora 
2222       complted   2000      io       20000  

tablesectorb

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

Выход

eventname eventid openingdate resultstatus  eventtype
alpha      2222    2019-08-07  completed     44
beta       22299   2019-08-09   completed    48

так что вы видите, что я просто хочу накопленную четную дату, имя события, тип события и, resulttatus (resultstatus wЯ буду одинаков для вечерних вечеров в каждом столе

Ответы [ 2 ]

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

Неважно, в какой из трех таблиц секторов происходит событие.Таким образом, вы можете рассматривать таблицы как один, склеивая их вместе с UNION ALL.(Для меня это даже выглядит как плохая модель данных, и вам лучше иметь одну таблицу со столбцом типа сектора вместо одной таблицы на сектор.)

Склейте строки трех таблиц вместе, ограничиваясь менеджерами,агрегировать по идентификатору события и присоединиться.

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;
0 голосов
/ 04 марта 2019

Вы должны использовать DISTINCT для SUBQUERY с оператором 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
      )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...