считать из разных таблиц одним запросом - PullRequest
1 голос
/ 10 октября 2019

логины таблицы:

userid  logintime
11111   2019.10.10
11111   2019.09.10
22222   2019.10.10

преимущества таблицы:

userid  benefit
11111   A
11111   B
22222   C
22222   C
22222   C

Я хочу получить результат как:

userid  benefitcount logincount
11111   2            2
22222   3            1

Этот код не работает. Как я могу это исправить?

select count(B.userid) as benefitcounts, count(UL.userid) as userlogins
from userlogins UL
inner join benefit B on B.userid=UL.userid
group by UL.userid

Спасибо

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Вы можете JOIN два агрегированных подзапроса, как указано ниже:

SELECT 
    u.userid,
    u.logincount,
    b.benefitcount
FROM
(
    SELECT userid, COUNT(*) logincount FROM userlogins GROUP BY userid
) u
INNER JOIN (
    SELECT userid, COUNT(*) benefitcount FROM benefits GROUP BY userid
) b ON u.userid = b.userid

Этот запрос можно оптимизировать, если у вас есть уникальный ключ в каждой таблице:

SELECT 
    u.userid,
    COUNT(DISTINCT u.id) logincount,
    COUNT(DISTINCT b.id) benefitcount
FROM userlogins u
INNER JOIN benefitcount b ON u.userid = b.userid
GROUP BY u.userid
1 голос
/ 10 октября 2019

Хотя, вероятно, не оптимально с точки зрения производительности, это должно дать желаемый результат

SELECT A.userid, B.count as benefitcount, A.count as logincount
FROM
(
    SELECT userid, COUNT(*) AS count
    FROM benefits
    GROUP BY userid
) A
INNER JOIN
(
    SELECT userid, COUNT(*) AS count
    FROM userlogins
    GROUP BY userid
) B
ON A.userid = B.userid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...