【发布时间】:2021-11-27 05:28:52
【问题描述】:
我有一个items 表
| id | name |
|---|---|
| 1 | Nganu |
| 2 | Kae |
| 3 | Lho |
我还有一个item_usages 表:
| id | item_id | user_id | usage_time | |
|---|---|---|---|---|
| 1 | 1 | 99 | 2021-10-07 00:00:00 | |
| 2 | 2 | 99 | 2021-10-07 00:00:00 | |
| 3 | 1 | 99 | 2021-10-08 00:00:00 | |
| 4 | 1 | 22 | 2021-10-08 00:00:00 | |
| 5 | 3 | 22 | 2021-10-08 00:00:00 | |
| 6 | 1 | 99 | 2021-10-08 00:00:00 |
我想在查询中找到一个项目的总使用量和用户使用量。我想查找 user_id 99 用法的示例,预期结果:
| id | name | total_usage | user_usage |
|---|---|---|---|
| 2 | Kae | 1 | 1 |
| 1 | Nganu | 4 | 3 |
| 3 | Lho | 1 | 0 |
我试过了:
select
"items".*,
count(total_usage.id) as total_usage,
count(user_usage.id) as user_usage
from
"items"
left join
"item_usages" as "total_usage" on "items"."id" = "total_usage"."item_id"
left join
"item_usages" as "user_usage" on "user_usage"."item_id" = "items"."id"
and "user_usage"."user_id" = 99
group by
"items"."id";
但它会返回:
| id | name | total_usage | user_usage |
|---|---|---|---|
| 2 | Kae | 1 | 1 |
| 1 | Nganu | 12 | 12 |
| 3 | Lho | 1 | 0 |
item_usages 只有 6 行,为什么 Nganu 两种用法都有 12 行?如何修复我的查询?
我在 PostgreSQL 12.8 和 13.4 上试过,我也在 SQLFiddle(PostgreSQL 9.6) 上测试过,这里是链接:
http://sqlfiddle.com/#!17/f1aac/5
我得到了返回正确结果的查询:
select
"items".*,
min(total_usage.total_count) as total_usage,
count(user_usage.id) as user_usage
from "items"
left join
(select item_id,count(item_id) as total_count from item_usages group by item_id) as total_usage
on "items"."id" = "total_usage"."item_id"
left join "item_usages" as "user_usage"
on "user_usage"."item_id" = "items"."id" and "user_usage"."user_id" = 99
group by "items"."id";
但我不知道性能,所以如果可能的话我仍然会找到更快的查询并且仍然想知道:
为什么我的第一个查询给出了错误的结果?
【问题讨论】:
标签: sql postgresql join count left-join