【问题标题】:MySQL - Same row allotted two usersMySQL - 同一行分配了两个用户
【发布时间】:2018-10-29 21:06:29
【问题描述】:

我正在处理一个任务队列项目,我的组织中的几名员工将使用该项目。我们正处于测试阶段,大约有 10 个用户正在对其进行测试。

我有任务表。在此任务表中有 1000 多条记录。

任务表的结构是:

id  task_details category_id    status  

为每个用户分配一个任务并保存在名为 user_tasks 的子表中。

user_tasks 表的结构是:

id  task_id     user_id    status  

users表的结构是:

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中的task_id是否设置为UNIQUE?
  • 问题很可能出在存储用户任务的代码中。您要么必须在插入之前手动检查新行不是重复行,要么在 user_tasks 表中的 task_id and user_id 上设置唯一索引
  • 我无法在 task_iduser_id 上设置唯一索引,因为任务将在几天/几天后再次处于待处理状态,并且可能会分配给不同的用户。
  • @mickmackusa 也许当 SO 的问题提交协议发生根本性变化时 - 但我并不抱太大希望。

标签: php mysql


【解决方案1】:

首先,为您的 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')。

要进一步添加其他用户,您需要先将“Inprogress”设置为“Done”或“Escalated”等。

我还会添加一个日期列来跟踪状态何时分配给特定用户。

【讨论】:

  • 我添加了用户表的结构。我在问题中输入的查询用于检查待处理任务并将其保存在 user_tasks 表中。
  • @sas 您如何知道哪个用户可用?你看状态栏了吗?
  • 登录用户。当登录用户选择查询运行的任务时,获取待处理任务并将其保存在 user_tasks 表中。
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多