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