MySQL - в одной строке выделено два пользователя

0

Я работаю над проектом очереди задач, который будет использоваться несколькими сотрудниками в моей организации. Мы находимся в стадии тестирования, и около 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

Спасибо

  • 0
    Установлен ли для параметра task_id в user_tasks значение UNIQUE?
  • 1
    Скорее всего, проблема заключается в коде, который хранит задачи, заданные пользователем. Вы должны либо вручную проверить, что новая строка не является дублируемой перед тем, как вставить ее, либо установить уникальный индекс для task_id and user_id в таблице user_tasks
Показать ещё 8 комментариев
Теги:

1 ответ

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;

Это вставит задачи категории 1 и ожидающие в статусе, и только если нет открытой записи user_task (status = 'Inprogress').

Чтобы дополнительно добавить других пользователей, вам нужно сначала установить "Inprogress" на "Done" или "Escalated" или что-то еще.

Я также добавил бы столбец даты, чтобы отслеживать, когда статус был присвоен конкретному пользователю.

  • 0
    Я добавил структуру моей таблицы пользователей. Запрос, который я вставил в свой вопрос, используется для проверки ожидающей задачи и сохранения ее в таблице user_tasks.
  • 0
    @sas Как узнать, какой пользователь доступен? Вы смотрите на столбец статуса?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню