2

我正在尝试选择当前未分配给用户的作业。

Users table: id | name
Jobs:        id | name
Assigned:    id | user_id | job_id | date_assigned

我想选择所有当前未采取的工作。例子:

用户:

id   |   name
--------------
1    |   Chris
2    |   Steve

工作

id   |  name
---------------
1    |  Sweep
2    |  Skids
3    |  Mop

已分配

id   |   user_id  |   job_id    |   date_assigned 
-------------------------------------------------
1    |   1        |   1         |   2012-01-01
2    |   1        |   2         |   2012-01-02
3    |   2        |   3         |   2012-01-05

不能给两个人分配同一个工作。所以查询会返回

[1, Sweep]

自从一天后 Chris 搬到 Skids 后,没有人在做这件事。

至今:

SELECT
    *
FROM
    jobs
WHERE
    id
NOT IN
    (
        SELECT
            DISTINCT(job_id)
        FROM
            assigned
        ORDER BY
            date_assigned
        DESC
    )

但是,此查询在同一数据集上返回 NULL。没有解决扫描作业现在打开的问题,因为它当前没有被处理。

4

4 回答 4

2
SELECT a.*
FROM jobs a
LEFT JOIN
(
    SELECT a.job_id
    FROM assigned a
    INNER JOIN
    (
        SELECT MAX(id) AS maxid
        FROM assigned
        GROUP BY user_id
    ) b ON a.id = b.maxid
) b ON a.id = b.job_id
WHERE b.job_id IS NULL

这将获取每个用户的最新作业。一旦我们有了这些工作的列表,我们就会选择不在该列表中的所有工作。

于 2012-07-24T18:51:07.703 回答
1

你可以试试这个变种:

select * from jobs
 where id not in (
  select job_id from (
    select user_id, job_id, max(date_assigned)
      from assigned
  group by user_id, job_id));
于 2012-07-24T18:52:13.900 回答
0

首先,您需要查看仅包含当前工作分配的列表。订购是不够的。按照您的设置方式,您需要来自已分配的工作分配的不同子集,它们是最新的分配。

所以你想要一个分组子查询,比如

select job_id, user_id, max(date_assigned) last_assigned from assigned group by job_id, user_id

把它们放在一起,你得到

select id, name from jobs
where id not in (
  select job_id as id from (
    select job_id, user_id, max(date_assigned) last_assigned from assigned 
    group by job_id, user_id
  )
)

作为一项额外功能,您可以传递“last_assigned”的值,它会告诉您作业空闲了多长时间。

于 2012-07-24T19:03:51.380 回答
0

我想你可能想要:

SELECT *
FROM jobs
WHERE id NOT IN (SELECT job_id
                 from assigned
                 where user_id is not null
                )

这假设重新分配某人会更改原始分配中的用户 ID。这会发生吗?顺便说一句,我还简化了子查询。

于 2012-07-24T18:52:37.097 回答