Как сделать подсчет на 2 таблицы - PullRequest
0 голосов
/ 10 января 2020

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

testId первичного ключа, tpId

SELECT Count(*) AS count, 
       testid, 
       tpid 
FROM   cicdexpecteddocument e 
WHERE  e.testid = 8 
GROUP  BY e.tpid; 

3   8   756abdaa-31c0-11ea-9c52-0245f4ff0412
3   8   7ea2b31b-31c0-11ea-9c52-0245f4ff0412
1   8   c25780cb-31c0-11ea-9c52-0245f4ff0412
2   8   c9f70ed9-31c0-11ea-9c52-0245f4ff0412

testId первичного ключа, tpId, executeId

SELECT Count(*) AS count, 
       testid, 
       tpid 
FROM   cicdactualdocument a 
WHERE  a.testid = 8 
       AND a.executionid = 
           'execution-d0c5e270-50f2-472e-a609-ac2c381e0a5f-2020.01.09' 
GROUP  BY tpid; 

2   8   7ea2b31b-31c0-11ea-9c52-0245f4ff0412
2   8   c25780cb-31c0-11ea-9c52-0245f4ff0412
2   8   c9f70ed9-31c0-11ea-9c52-0245f4ff0412

Я хотел бы закончить чем-то как

3       3   8   756abdaa-31c0-11ea-9c52-0245f4ff0412
3   2   1   8   87ea2b31b-31c0-11ea-9c52-0245f4ff0412
1   2   -1  8   8c25780cb-31c0-11ea-9c52-0245f4ff0412
2   2   0   8   8c9f70ed9-31c0-11ea-9c52-0245f4ff0412

Любое руководство приветствуется. Заранее спасибо

1 Ответ

0 голосов
/ 10 января 2020

Вот код. См. Объяснение ниже.

SELECT count_t1, count_t2,
  IFNULL(count_t1, 0) - IFNULL(count_t2, 0) AS diff,
  t1.testid, t1.tpid
FROM (
  SELECT COUNT(*) AS count_t1, 
    testid, 
    tpid
  FROM cicdexpecteddocument e
  WHERE e.testid = 8
  GROUP BY e.tpid
) AS t1
LEFT OUTER JOIN 
(
  SELECT COUNT(*) AS count_t2, 
    testid, 
    tpid
  FROM cicdactualdocument a
  WHERE a.testid = 8 AND a.executionid = 
    'execution-d0c5e270-50f2-472e-a609-ac2c381e0a5f-2020.01.09'
  GROUP BY tpid
) AS t2 ON t1.testid = t2.testid AND t1.tpid = t2.tpid
ORDER BY tpid

Рассекать это:

Пропустить столбцы SELECT и заметить, как два запроса, которые вы указали для каждой таблицы, содержатся в круглых скобках с последующим " AS t1 "(или t2) - это подзапросы. После того, как 2-ой подзапрос (от 2-ой до последней строки), где я указал условие соединения.

Далее, как вычисляется столбец "diff". Он использует функцию IFNULL(), которая возвращает значение, указанное во втором параметре, если первичное значение равно NULL. Это позволяет базе данных выполнять вычисления даже на NULL-значениях.

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...