Как обновить, только если значение пусто, иначе обновить в следующей строке

0

У меня есть система назначения задач, и я хочу назначать людей для определенных задач. Стол раскладывается так:

+---------+---------+-------------+-------------+-------------+
|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

Но, насколько мне известно, это общая ошибка.

  • 0
    Я пытаюсь понять это. хотите ли вы заполнить все столбцы персон, которые являются пустыми, для конкретной задачи, которую вы пытаетесь обновить, или просто хотите, чтобы она посмотрела на следующий пустой столбец между person1, person2, person3 и person4 и обновила столбец, который пусто и после этого не заполняет следующие столбцы, даже если они пусты
  • 0
    @pauldrodriguez, я хочу обновить только следующий пустой столбец, поэтому при каждом обновлении он заполняет таблицу дальше и не перезаписывает данные. Так что это последний вариант, который вы предложили.
Показать ещё 1 комментарий
Теги:

3 ответа

0

Это должно работать для того, что вам нужно:

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;
  • 0
    Каким-то образом ни одно из этих решений не работает. Одна вещь, которую я только что попробовал и работает, - это оператор обновления с оператором where, который проверяет, является ли столбец пустым, однако мне нужно 5 из этих операторов, это может вызвать какие-либо проблемы?
  • 0
    Что вышеупомянутое решение не делает то, что вам нужно? Я проверил это в песочнице, и она сделала именно то, что вы просили.
Показать ещё 2 комментария
0

Ваш лучший вариант в долгосрочной перспективе - это редизайн стола:

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)

В любом из вышеперечисленных случаев вы просто удаляете строки, чтобы "отменить назначение" людей, и просто вставляете строки для их назначения. Если порядок действительно имеет значение, он может стать немного сложнее, но ненамного.

0

см. пример кода ниже. то, что я сделал, чтобы обновить таблицу задач, - это взять внутреннее соединение таблицы с собой, чтобы получить старые значения.

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

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

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

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

вот где я это проверил: 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';
  • 0
    Таким образом, человек 1,2,3 и т.д., где примеры. Я ввел свои собственные имена столбцов и ввел его в свой php-файл, выполнил его, но он не работал, он не выдавал ошибок, но также не обновлялся. Не могли бы вы взглянуть на это, я разместил всю информацию о моя база данных там также, db-fiddle.com/f/bxSWZhj7NXfm7J5pCQ5Kw1/…
  • 0
    см. эту ссылку: db-fiddle.com/f/kXF4Syubfz3GmzU56ebvyF/1 обратите внимание, что песочница предназначена только для кода SQL. он не будет работать с PHP-кодом или HTML-формами. есть две переменные @eenheid и @id которые вам нужно будет заменить на их эквиваленты PHP, когда вы перемещаете их в свой скрипт PHP.

Ещё вопросы

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