Mysql SQL查询-不在一组已在使用的项中

Mysql SQL查询-不在一组已在使用的项中,mysql,sql,Mysql,Sql,我正在尝试选择当前未分配给用户的作业 Users table: id | name Jobs: id | name Assigned: id | user_id | job_id | date_assigned 我想选择当前未执行的所有作业。例如: 用户: id | name -------------- 1 | Chris 2 | Steve 工作 指派 id | user_id | job_id | date_ass

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

Users table: id | name
Jobs:        id | name
Assigned:    id | user_id | job_id | date_assigned
我想选择当前未执行的所有作业。例如:

用户:

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

指派

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]
因为克里斯一天后搬到了斯基德,所以没人在做这件事

到目前为止:

SELECT
    *
FROM
    jobs
WHERE
    id
NOT IN
    (
        SELECT
            DISTINCT(job_id)
        FROM
            assigned
        ORDER BY
            date_assigned
        DESC
    )
但是,此查询在同一数据集上返回NULL。未解决扫描作业现在已打开的问题,因为当前未对其进行处理

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

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

您可以尝试以下变体:

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));

我想你可能想要:

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

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

首先,您需要查看当前工作分配的列表。订购是不够的。按照您的设置方式,您需要从最近分配的工作分配中获得一个不同的工作分配子集

所以您需要一个分组子查询,比如

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”的值,它会告诉您一个作业空闲了多长时间。

这似乎对我不起作用。但我会继续努力。@user1549575你能至少解释一下为什么它不起作用吗?这是一个错误、错误的结果吗?另外,你能回答我在问题评论中提出的问题吗。你所说的“当前已采取”是什么意思?它不会起作用,因为它不能回答问题。问题不在于选择从未分配过的作业。这是为了正确地对作业历史进行排序。它不会过滤当前执行的作业,而是显示所有作业。@Zane Bien稍加调整后,我使它工作了!非常感谢。(我不得不简化我的例子,因为我的问题要大得多)
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
  )
)