Подсчет записей, созданных пользователями в нескольких таблицах - PullRequest
0 голосов
/ 17 января 2020

SQL newb ie и не могу найти ответ, который работает для меня ..

У меня три таблицы; давайте назовем их Пользователи , Данные1 и Данные2 .

Пользователи могут быть «проверены» или «не подтверждены»; это не имеет значения, могут ли они добавлять записи в Data1 / Data2.

Не все пользователи будут добавлять записи, некоторые будут добавлять в Data1, но не в Data2 и т. Д. c.

То, что я хотел бы сделать, это получить вывод - только для проверенных пользователей - в соответствии с:

Users.ID | Data1 Record Count | Data2 Record Count
001        0                    12
002        40                   1
003        11                   31
004        0                    0
005        101                  0

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

Любая помощь высоко ценится!

1 Ответ

1 голос
/ 17 января 2020

Используйте union all и group by:

select userid, sum(cnt_1), sum(cnt_2)
from ((select u.userid, 0 as cnt_1, 0 as cnt_2
       from users u
       where validated = 1
      ) union all
      (select data1.userid, 1, 0
       from data1 join
            users u
            using (userid)
       where u.validated = 1
      ) union all
      (select data2.userid, 0, 1
       from data2 u
            using (userid)
       where u.validated = 1
      )
     ) udd
group by userid;

Или альтернативные коррелированные подзапросы:

select u.userid,
       (select count(*)
        from data1
         where data1.userid = u.userid
       ) as cnt_1,
       (select count(*)
        from data2
         where data2.userid = u.userid
       ) as cnt_1,
from users u
where u.validated = 1;

С индексами data1(userid) и data2(userid) это вероятно, самый быстрый метод.

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