【发布时间】:2019-02-08 02:54:48
【问题描述】:
假设我有两张桌子:user 和 diary。
select count(id)
from user
where is_tester is false
这里的主键总是称为id。上面的这个查询给了我大约 270000,这意味着我有大约 270000 个用户。现在我想知道每个用户有多少日记。所以我去了:
select u.id as user_id, u.dm_type, count(d.id) as bg_count
from diary as d
right join (
select id, dm_type
from user
where is_tester is false
) as u
on d.user_id = u.id
where d.glucose_value > 0
group by u.id, u.dm_type
每个用户只能拥有一种dm_type。我期待它会告诉我每个用户有多少日记,如果没有任何日记,它会给我一个 NA 或 0,因为我使用了right join。但是,返回的表只有大约 75000 行,并且该表中的每个用户至少有一本日记。那不是我想要的。为什么会发生,我应该如何正确处理?
我参考了Combining RIGHT JOIN with COUNT,并根据接受答案的建议统计了一个特定的字段。
根据 cmets 进行编辑:
user:
| id | dm_type | is_tester |
|----|---------|-----------|
| 1 | 1 | False |
| 2 | 1 | False |
| 3 | 2 | False |
| 4 | no | False |
| 5 | 2 | True |
diary:
| id | user_id | glucose_value |
|----|---------|---------------|
| 1 | 1 | -2 |
| 2 | 1 | 80 |
| 3 | 2 | 78 |
| 4 | 2 | 100 |
| 5 | 4 | 83 |
| 6 | 5 | 90 |
预期结果:
| user_id | dm_type | bg_count |
|---------|---------|----------|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 0 |
| 4 | no | 1 |
【问题讨论】:
-
请分享表结构和所需的输出
-
@user2864740
right outer join给了我完全相同的结果。顺便说一句,您似乎误解了我想要的输出。我不想要HAVING COUNT(d.id) > 0或INNER JOIN,因为我确实需要COUNT(d.id)的那些行是0。 -
@user2864740 对不起,我不明白你想说什么……我做了
right join,不是吗?根据您上面的评论,我尝试了right out join。那么它有什么问题呢? -
@ytu,你能试试下面的答案吗,我希望它能解决你的问题
-
@codeLover 请查看我在问题中的编辑。
标签: sql postgresql count outer-join