【发布时间】:2015-11-13 09:58:53
【问题描述】:
我用的是postgreSQL,我有两张表,一张是user,一张是usertasks。
用户有以下字段:userid, username
usertasks 有以下字段:id、taskdate、userid
userid 和 id 是上表的主键
我想查找过去 3 个月内完成的任务少于 3 次的所有用户。 我不能在这里使用 WHERE taskdate>(last3months),因为我需要所有用户,而不仅仅是过去 3 个月内完成任务的用户。 (有些用户可能在 6 个月前完成了他们的任务,但在最近 3 个月内没有做任何任务,所以我也需要这些用户)
我的查询是这样的:
select userid
from users
EXCEPT
select userid from usertasks
where usertasks.taskdate > CURRENT_DATE - INTERVAL '3 months'
group by usertasks.userid having count(id) >= 3
问题: 上面的查询完美运行并返回正确的结果,我也尝试过 NOT IN ,而不是 EXCEPT,这也很好,但问题是我遇到了性能问题,这可以在一个查询中完成而不使用子查询,可以使用连接或任何其他方法完成吗?使用子查询使其变慢。
测试用例是针对 10 万用户和 100 万个任务的,我正在寻找最快的方法..
【问题讨论】:
-
“最快的方法”是:为你的数据模型添加一些结构,例如主键、外键和可能索引。之后,每个适当(且合理)的查询都会产生大致相同的性能。
标签: sql postgresql join group-by