Сложные MySQL хранимые Proceedure

у меня есть полу-сложный хранимую процедуру, что мне нужно создать. Я не совсем DBA здесь, но никто в моей компании лучше, чем я. Основная идея-у меня есть группы задач. Пользователь выполнит эти задачи и получает флаг для каждой задачи завершено. Чтобы считаться "заполнить" пользователь должен иметь все группы поставленных задач закончил. Нечто вроде лакмусовой бумажки, что некоторые из этих задач может быть обертки для других групп задач.

например, мы имеем следующие задачи:

Task 1
Task 2 
Task 3
Task 4 -> (1, 2, 3)
Task 5 -> (1, 2)
Task 6
Task 7 -> (5, 6)

После того как пользователь завершил задач 1 и 2, они неявно выполненное задание 5. Как только они закончат задание 3, то у них будет неявно выполненное задание 4.

Если другой пользователь готово задач 1, 2 и 6, то они будут иметь неявно окончил 1, 2, 5, 6, 7.

В обратном, если назначение требуется только Задание 7, он бы расширение задач, требующих 6 и 5, которые бы 1 и 2.

у меня есть пять базовых таблиц: userCompletedTask, assignmentRequiredTask, compoundTask, userTaskAssignment и задачи. Я опускаю пользователя и назначение таблицы, как это лишним.

userCompletedTask:
userID (Foreign Key on user)
taskID (Foreign Key on task)

usertTaskAssignment:
userID (Foreign key on user)
assignmentID (Foreign key on assignment)

assignmentRequiredTask:
assignmentID (Foreign key on assignment)
taskID (Foreign key on task)

task:
taskID (primary key)
compound (boolean flag. If 1, it is compound)

compoundTask:
parentID (foreign key on task)
childID (foreign key on task)

пользователь получает назначен userTaskAssignment задачу, которая требует от 4 до завершения. Я хочу создать хранимую процедуру, что бы проверить userCompletedTasks против assignmentRequiredTasks, проверка, если имеются соответствующие compoundTasks.

псевдо-код будет следующим образом:

collection tasksCompleted = user->getTasksCompleted
collection tasksRequired = new collection

foreach task in assignment->getRequiredTasks 
   if(task.isCompound) 
      tasksRequired->addAll(getCompountTasks(task))
   else 
      tasksRequired->add(task)

if tasksCompleted->containsAll(tasksRequired)
   return true
else 
   return false

я просто не знаю, MySQL/SQL внутренней достаточно хорошо, чтобы перевести все это в хранимую процедуру. В крайнем случае я вытащить код в приложение, но это действительно подойдут на уровне данных. Любая помощь будет принята с благодарностью.

" ИЗМЕНИТЬ".

Как было указано ниже, compoundTask записи сами по себе могут быть сложных задач. Таким образом, вы должны рекурсивный детализации, чтобы получить список всех не сложных задач, которые должны быть завершены. Я расширил выше пример, чтобы проиллюстрировать это.

Найдено 3 ответа:

Complicated MySQL Stored Proceedure

http://stackoverflow.com/questions/677729/complicated-mysql-stored-proceedure

Посмотреть решение →

Яндекс.Метрика