У меня есть система назначения задач, и я хочу назначать людей для определенных задач. Стол раскладывается так:
+---------+---------+-------------+-------------+-------------+
|Task name| person1 | person2 | person3 | person4 |
+---------+---------+-------------+-------------+-------------+
Если задача уже была назначена, например, для 2 человек, я хочу, чтобы функция обновления заполняла лицо 3. Таким образом, он в основном проверяет, является ли значение пустым, если да, введите данные, в противном случае проверьте, является ли значение в следующем столбце пустым, и поместите его там. и продолжайте это для всех столбцов.
Я уже пробовал это, но это выдает ошибку:
UPDATE data SET IF(person1 IS NULL, person1,
IF(person2 IS NULL,person2,
IF(person3 IS NULL, person3,
IF(person4 IS NULL, person4,
IF(person5 IS NULL, person5, person6)))))
='$person_name' WHERE id=$id
Это выдает следующую ошибку:
У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который следует использовать рядом с "IF (person1 IS NULL, person1, IF (person2 IS NULL, person2, IF (person3 IS NULL, back") в строке 1
Но, насколько мне известно, это общая ошибка.
Это должно работать для того, что вам нужно:
UPDATE 'data'
SET person4 = IF(person4 IS NULL AND person3 IS NOT NULL, 'value', person4),
person3 = IF(person3 IS NULL AND person2 IS NOT NULL, 'value', person3),
person2 = IF(person2 IS NULL AND person1 IS NOT NULL, 'value', person2),
person1 = IF(person1 IS NULL, 'value', person1)
WHERE id = $id;
Ваш лучший вариант в долгосрочной перспективе - это редизайн стола:
Tasks: TaskId (PK, auto inc), TaskName (varchar)
Task_Assignees: TaskId (references Tasks.TaskId), Person (varchar)
или лучше
Tasks: TaskId (PK, auto inc), TaskName (varchar)
Workers: WorkerId (PK, auto inc), WorkerName (varchar)
Task_Workers: TaskId (references Tasks.TaskId), WorkerId (references Workers.WorkerId)
В любом из вышеперечисленных случаев вы просто удаляете строки, чтобы "отменить назначение" людей, и просто вставляете строки для их назначения. Если порядок действительно имеет значение, он может стать немного сложнее, но ненамного.
см. пример кода ниже. то, что я сделал, чтобы обновить таблицу задач, - это взять внутреннее соединение таблицы с собой, чтобы получить старые значения.
причина, по которой нам нужно объединить таблицу с самим собой, заключается в том, что одна таблица будет содержать столбцы с обновленными значениями, а другая не будет изменять ее значения. таким образом, мы можем проверить, был ли обновлен столбец.
убедитесь, что таблица, которую вы обновляете, имеет уникальный идентификатор, к которому они могут присоединиться, чтобы только одна запись соединялась сама с собой.
остальное - это обновление столбцов лиц с указанием регистра. если столбец персонажа пуст, и вы не обновили ни одного предыдущего столбца персонажа, вы можете его обновить.
Я включил мою тестовую схему, которую я пытался смоделировать, вместе с запросом на обновление.
вот где я это проверил: https://www.db-fiddle.com/f/bxSWZhj7NXfm7J5pCQ5Kw1/0
create table my_tasks(
task_name VARCHAR(100),
person1 VARCHAR(100),
person2 VARCHAR(100),
person3 VARCHAR(100),
person4 VARCHAR(100)
);
insert into my_tasks (task_name,person1,person2,person3,person4) values('test',NULL,'fsd','fsd','fsdfs'),('test2','fsdfs',NULL,NULL,NULL),('test3','ffdsfs',NULL,'fsdfsf',NULL);
UPDATE my_tasks INNER JOIN my_tasks as tasks2 on my_tasks.task_name=tasks2.task_name
SET my_tasks.person1= CASE
WHEN my_tasks.person1 IS NULL THEN 'person 1 update'
ELSE my_tasks.person1
END,
my_tasks.person2 = CASE
WHEN my_tasks.person2 IS NULL AND my_tasks.person1=tasks2.person1
THEN 'person 2 update'
ELSE my_tasks.person2
END,
my_tasks.person3 = CASE
WHEN my_tasks.person3 IS NULL AND my_tasks.person2=tasks2.person2 AND my_tasks.person1=tasks2.person1
THEN 'person 3 update'
ELSE my_tasks.person3
END,
my_tasks.person4 = CASE
WHEN my_tasks.person4 IS NULL AND my_tasks.person3=tasks2.person3 AND my_tasks.person2=tasks2.person2 AND my_tasks.person1=tasks2.person1
THEN 'person 4 update'
ELSE my_tasks.person4
END
WHERE my_tasks.task_name='test3';
@eenheid
и @id
которые вам нужно будет заменить на их эквиваленты PHP, когда вы перемещаете их в свой скрипт PHP.