Выберите количество (*) и «объединить» более 3 таблиц - PullRequest
5 голосов
/ 01 марта 2011

Я ищу запрос на подсчет в объединении из 3 таблиц, который может подсчитать различные значения одной из этих таблиц.

У меня есть 3 таблицы, к которым мне нужно присоединиться, чтобы получить ожидаемые данные (Workflow, Message и Message_Workflow_Relation).

Я хочу получить количество рабочих процессов, сгруппированных по статусу + одно поле подключенной таблицы Message в моем результате (related_name). Связанное имя должно быть взято из записей, где поле adapter равно wf, однако иногда есть несколько записей Message, соответствующих этому условию, что приведет к большему количеству наборов данных в моем подсчете, чем тех, которые действительно есть.

Я почти уверен, что возможно разобраться, но только не работай. К сожалению, я не могу изменить структуру таблицы, так как это заданная схема продукта, который мы используем.

Моя структура таблицы выглядит следующим образом:

Workflow:

id | workflow_id | starttime | endtime | status
------------------------------------------------------
1  |          22 |         0 |     200 |     OK
2  |          23 |       220 |     920 |  ERROR
3  |          55 |       202 |     588 |     OK

Message_Workflow_Relation:

id | message_id | workflow_id |
-------------------------------
1  |        122 |          22 |
2  |        235 |          22 |
3  |        456 |          22 |
4  |        982 |          22 |
5  |        444 |          23 |
6  |        445 |          23 |
7  |        585 |          55 |
8  |        738 |          55 |
9  |        399 |          55 |

Сообщение:

id | message_id | starttime | endtime | adapter | related_name |
----------------------------------------------------------------
 1 |        122 |         0 |    2335 |      wf |   workflow_1 |
 2 |        235 |       222 |    1000 |   other |        other |
 3 |        456 |       343 |    2330 | another |      another |
 4 |        982 |       222 |    2200 |      wf |   workflow_1 |
 5 |        444 |      2223 |    3333 |      wf |   workflow_2 |
 6 |        445 |      1123 |    1244 |  manual |       manual |
 7 |        585 |      5555 |    5566 |      wf |   workflow_1 |
 8 |        738 |       655 |     999 |      wf |   worfklow_1 |
 9 |        399 |      6655 |    7732 | another |      another |

Это должно вернуть следующий результат:

count(*) | related_name | status |
----------------------------------
       2 |   workflow_1 |     OK |
       1 |   workflow_2 |  ERROR |

Я застрял с этим следующим утверждением, но я не уверен, как сделайте выбор на adapter = wf unique для каждого рабочего процесса:

select distinct
  count(*),
  m.related_name,
  w.status
from
  workflow as w,
  message as m,
  msg_bpm_rel as rel
where rel.workflow_id = w.workflow_id
  and rel.message_id = m.message_id
  and m.adapter = 'PE'
group by m.related_name,w.status

Это возвращает меня (4 workflow_1 вместо 2):

count(*) | related_name | status |
----------------------------------
       4 |   workflow_1 |     OK |
       1 |   workflow_2 |  ERROR |

Как мне сделать правильный запрос для достижения этого?

Любая помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 01 марта 2011

Вы можете сделать это, сгруппировав и посчитав отличное значение.

Так что-то вроде:

select count(distinct w.workflow_id), m.related_name,w.status 
from workflow as w, message as m, msg_bpm_rel as rel 
where rel.workflow_id = w.workflow_id and rel.message_id = m.message_id 
and m.adapter = 'PE' 
group by m.related_name, w.status

Это не проверено, но должно работать, я считаю:)

0 голосов
/ 27 июня 2018
    SELECT distinct theCount
    ,m.related_name
    ,w.status
    FROM workflow as w
    ,message as m
    ,msg_bpm_rel as rel
    ,(SELECT count(1) as theCount
    ,w.workflow_id as wf_id
    FROM workflow as w
    ,message as m
    ,msg_bpm_rel as rel 
    WHERE rel.workflow_id = w.workflow_id 
    AND   rel.message_id = m.message_id 
    AND   m.adapter = 'wf' 
    GROUP BY w.workflow_id) AS t
    WHERE t.wf_id = w.workflow_id 
    AND   rel.workflow_id = w.workflow_id 
    AND   rel.message_id = m.message_id 
    AND   m.adapter = 'wf'
0 голосов
/ 01 марта 2011

Моя первая попытка заставить запрос работать. Я не люблю использовать разные. Это заставляет меня думать, что все еще может быть что-то не так:

SELECT distinct theCount
      ,m.related_name
      ,w.status
FROM workflow as w
    ,message as m
    ,msg_bpm_rel as rel
    ,(SELECT count(1) as theCount
            ,w.workflow_id as wf_id
      FROM workflow as w
          ,message as m
          ,msg_bpm_rel as rel 
      WHERE rel.workflow_id = w.workflow_id 
      AND   rel.message_id = m.message_id 
      AND   m.adapter = 'wf' 
      GROUP BY w.workflow_id) AS t

WHERE t.wf_id = w.workflow_id 
AND   rel.workflow_id = w.workflow_id 
AND   rel.message_id = m.message_id 
AND   m.adapter = 'wf'

Важно отметить, как подсчет выполняется в этом запросе. Вы просто группировали по двум столбцам, которые оказались в части SELECT оператора SQL. Реальность такова, что для подсчета того, что вы хотели, вам нужно сгруппировать только по идентификатору рабочего процесса. Этот запрос делает это, а затем передает результат в другой запрос, чтобы отобразить то, что вы хотели.

...