php - MySQL - 同一行分配了两个用户
问题描述
我正在处理一个任务队列项目,我的组织中的几名员工将使用该项目。我们正处于测试阶段,大约有 10 个用户正在对其进行测试。
我有任务表。在此任务表中有 1000 多条记录。
任务表的结构是:
id task_details category_id status
每个用户都被分配了一个任务并保存在名为 user_tasks 的子表中。
user_tasks 表的结构是:
id task_id user_id status
用户表的结构是:
id user_name Email status
一个任务不能同时分配给两个用户。但是,我间歇性地面临 1 个任务行分配给 user_tasks 表中的两个不同用户的问题。
我的查询是:
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
谢谢
解决方案
首先,为您的 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;
这将插入类别 1 且处于待处理状态的任务,并且仅在没有打开的 user_task 记录时(状态 = 'Inprogress')。
要进一步添加其他用户,您需要先将“进行中”设置为“完成”或“升级”或其他内容。
我还会添加一个日期列来跟踪状态何时分配给特定用户。
推荐阅读
- javascript - 仅显示具有特定类型的数组内的对象 [GRAPHQL]
- c# - 无法从 asp.net core mvc 中的数据库更新我的模型
- c++ - 如何在 C++ 中的队列结构中使用 malloc
- kepserverex - 是否可以在 KepServerEx 中创建自定义模拟函数?
- c++ - 如何正确地将 int 类型的算术运算结果存储为 C++ 中的 double 类型和不同类型?
- c# - 是否有可能知道哪个 .dll 称为 C# 服务?即使调用首先通过 COM 层?
- json - 使用 NiFi 将 JSON 转换为 SQL 并在 DB2 中插入数据
- rust - 如何在 Rust 中使用非常量初始化程序初始化不可变的全局变量?
- azure - Azure RBAC 中的多个通配符
- c# - C# 严格检查一个字符串中的所有字符是否存在于另一个字符串中(无 LINQ)