Я работаю над проектом очереди задач, который будет использоваться несколькими сотрудниками в моей организации. Мы находимся в стадии тестирования, и около 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 (status = 'Inprogress').
Чтобы дополнительно добавить других пользователей, вам нужно сначала установить "Inprogress" на "Done" или "Escalated" или что-то еще.
Я также добавил бы столбец даты, чтобы отслеживать, когда статус был присвоен конкретному пользователю.
task_id and user_id
в таблицеuser_tasks