【发布时间】:2019-03-22 15:59:29
【问题描述】:
我很难使用 PostgreSQL SELECT,起初看起来很简单。涉及表:
CREATE TABLE events (id INT, customers_id INT);
CREATE TABLE jobs (
events_id INT,
"from" TIMESTAMP,
until TIMESTAMP,
users_id INT);
- 每个事件可以有多个作业
- 事件的开始和结束由相应作业的最低
"from"和最高until定义 - 每个作业都可以分配给一个用户
我需要如下表:
events_id | customers_id | min(from) | max(until) | total_jobs | open_jobs
1 | 1 | .. 08:00 | .. 11:00 | 4 | 1
到目前为止我的选择:
SELECT e.id, e.customers_id, min(j.from) as min_from, max(j.until) as max_until,
count(j.id) as total_jobs
FROM events e
LEFT JOIN jobs j ON j.events_id = e.id
GROUP BY e.id, e.customers_id
这给了我前 5 列的结果,但我如何才能仅包含 users_id = NULL 的作业的第二个计数?我假设我需要第二个 LEFT JOIN 在工作表上,但不知何故我无法让它工作。
我怎样才能正确有效地实现它?
【问题讨论】:
-
只对 users_id = NULL 的作业进行第二次计数是什么意思?什么是空缺职位?没有用户的工作?即,您想知道如何计算 open_jobs 即 user_id 为 null 的作业数?
-
您是在查询所有事件(如您的查询所暗示的那样),还是查询一个或几个给定的
events_id?请始终披露您的 Postgres 版本。SELECT version()有帮助。我冒昧地修复了您设置的语法。像from这样的保留字需要双引号(除非像j.from那样有表限定)。那么你在标题中提到的“排序”呢? -
@KristjanKica 很抱歉没有澄清“空缺职位”。我的意思是 users_id = NULL 的工作
-
@ErwinBrandstetter 我正在查询所有事件。 Postgres 版本是 10.5。感谢您的编辑。我忘记排序了,但它只是一个
ORDER BY min("from")
标签: sql postgresql eloquent left-join aggregate