我有这个按人返回帐号的查询
SELECT p.id, COUNT(a.id) accounts
FROM Person p
LEFT JOIN Account a
ON a.person_id = p.id
WHERE p.id = 1
GROUP BY p.id;
它找不到。如果此人有两个帐户,则会为帐户返回2。 但我还需要一个活跃的帐户计数。我试着这样做:
SELECT p.id, COUNT(a.id) accounts, COUNT(a1.id) active_accounts
FROM Person p
LEFT JOIN Account a
ON a.person_id = p.id
LEFT JOIN Account a1
ON a1.person_id = p.id AND a1.state = '0'
WHERE p.id = 1
GROUP BY p.id;
但是此查询为帐户返回4而不是2。 如何解决此问题?
答案 0 :(得分:4)
您的查询生成笛卡尔积,每个帐户都与其他帐户一起
您需要一次加入:
SELECT
p.id,
COUNT(a.id) total_accounts,
sum(case when a1.state = '0' then 0 else 1 end) inactive_accounts,
sum(case when a1.state = '0' then 1 else 0 end) active_accounts
FROM Person p
LEFT JOIN Account a
ON a.person_id = p.id
WHERE p.id = 1
GROUP BY p.id;
答案 1 :(得分:1)
你可以用它。我假设state ='0'表示活动。
SELECT p.id, COUNT(a.id) accounts, SUM(CASE WHEN a.state = '0' THEN 1 ELSE 0 END) active_accounts
FROM Person p
LEFT JOIN Account a
ON a.person_id = p.id
WHERE p.id = 1
GROUP BY p.id;