我正在执行一个任务队列项目,该项目将由组织中的多个员工使用。我们正处于测试阶段,大约有10个用户正在对此进行测试。
我有任务表。在此任务表中,有1000多个记录。
任务表的结构为:
id task_details category_id status
为每个用户分配一个任务,并将其保存在名为user_tasks的子表中。
user_tasks表的结构为:
id task_id user_id status
用户表的结构为:
id user_name Email status
不能同时将任务分配给两个用户。但是,我断断续续地面临在user_tasks表中将1个任务行分配给两个不同用户的问题。
我的查询是:
SELECT *
FROM tasks t
WHERE
t.status="Pending"
AND t.category_id=1
AND t.id NOT IN (SELECT task_id FROM user_tasks ut WHERE ut.task_id=t.id and ut.status='Inprogress')
LIMIT 1
如果查询返回一条记录,它将保存在user_tasks表中。
有人可以帮助我发现并解决问题吗?
我正在使用Mysql和Php
谢谢
答案 0 :(得分:0)
首先,将索引添加到user_tasks表中,以避免重复。
ALTER TABLE `temp`.`user_tasks`
ADD UNIQUE INDEX `uq_user_task` (`task_id` ASC, `user_id` ASC);
编辑
根据您的评论,该表将用于将任务重新分配给其他用户,我将使用以下查询将记录插入该表...
INSERT INTO user_tasks (task_id, user_id, `status`)
SELECT id, :user_id, 'Inprogress'
FROM tasks t
WHERE NOT EXISTS (SELECT 1 FROM user_tasks WHERE task_id = t.id AND `status` = 'Inprogress')
AND t.category_id = 1 AND t.`status` = 'Pending'
LIMIT 1;
仅当没有打开的user_task记录(状态=“进行中”)时,这才会插入状态1和状态为待处理的任务。
要进一步添加其他用户,您需要先将“进行中”设置为“完成”或“上报”或其他内容。
我还将添加一个日期列以跟踪将状态分配给特定用户的时间。