Как правильно составить запрос UPDATE, если название столбца является переменной?

Как можно улучшить код для внесения изменений в таблицу, используя переменные в качестве названия столбца? Как оптимизировать код для правильного формирования запроса при изменении значений в столбцах id, count1, count2 и count3, чтобы избежать повторяющихся конструкций условий с if?
  • 9 марта 2024 г. 7:38
Ответы на вопрос 2
Для того чтобы использовать переменную как название столбца в запросе UPDATE, можно использовать конструкцию типа CONCAT для формирования строки запроса. Например:

```sql
SET @column_name = 'название_столбца';
SET @new_value = 'новое_значение';

SET @query = CONCAT('UPDATE таблица SET ', @column_name, ' = ', @new_value);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
```

Чтобы улучшить код и избежать повторяющихся конструкций условий с if, можно использовать CASE выражения. Например:

```sql
UPDATE таблица
SET count1 = CASE
              WHEN id = 1 THEN count1 + 1
              ELSE count1
              END,
    count2 = CASE
              WHEN id = 2 THEN count2 + 1
              ELSE count2
              END,
    count3 = CASE
              WHEN id = 3 THEN count3 + 1
              ELSE count3
              END
WHERE id IN (1, 2, 3);
```

Это позволит избежать повторяющихся конструкций с условиями if и сделает код более читаемым и легким для поддержки.
Как насчет оператора CASE? 

$sql = "UPDATE `list` 
        SET count1 = CASE WHEN id = ? AND ? = 1 THEN count1 - ? ELSE count1 END,
            count2 = CASE WHEN id = ? AND ? = 2 THEN count2 - ? ELSE count2 END,
            count3 = CASE WHEN id = ? AND ? = 3 THEN count3 - ? ELSE count3 END
        WHERE id = ?";

$stmt = $conn->prepare($sql);

foreach ($data as $id => $value) {
    $idParts = explode("-", $id);
    $count = $value['count'];
    $stmt->execute([$idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0]]);
}


Здесь используется оператор CASE для обновления нужного столбца в зависимости от значения $idParts[1]. Если $idParts[1] не соответствует ни одному из условий, то значение столбца остается неизменным. Ну и не забываем про подготовленный запрос prepare чтобы избежать возможной инъекции
Похожие вопросы