2016-03-30 4 views
2

У меня есть динамическая таблица с именем «продукты» с несколькими языками. Столбцы таблицы выглядит следующим образом:Mysql обновить все столбцы, начинающиеся с того же имени

id, product_id, store_de, store_en, store_fr, store_es... etc 

языки могут быть более или менее.

Теперь я хочу, чтобы обновить эту таблицу и установить все столбцы, начиная с «store_» дорожить 1.

Я попытался следующие:

$stmt = $dbh->prepare("UPDATE products SET `store_%` = ? WHERE product_id = ?"); 

$stmt->execute(array(1, $lastID)); 

Я получаю следующее сообщение об ошибке:

SQLSTATE [42S22]: Колонка не найдена: 1054 Неизвестный столбец 'store%' в 'список полей'

Есть ли способ обновить все столбцы, начинающиеся с «store_», или мне нужно перечислить все столбцы?


На основании ответа от jekaby здесь является полным решением, которое работает для меня:

$get_stores = $dbh->prepare("SHOW COLUMNS FROM products_active WHERE field REGEXP '^store'"); 
    $get_stores->execute(); 
    $stores = $get_stores->fetchAll(); 

    $update_string = ""; 
    $first_store = true; 
    foreach($stores as $store) { 
     if(!$first_store) { 

      $update_string .= ", "; 

     } else { 

      $first_store = false; 

     } 
     $update_string .= $store['Field']." = '".$status."'"; 

    } 

    $update_activity = $dbh->prepare("UPDATE products_active SET $update_string WHERE product_id = ?"); 
    $update_activity->execute(array($product_id)); 
+1

Вы можете войти в INFORMATION_SCHEMA, получить оттуда все нужные имена столбцов и создать запросы с этой информацией. Но это еще сложнее, чем делать это вручную. – Mihai

+0

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

ответ

3

Вы не можете сделать, как этот store_% - это несуществующий столбец в таблице, поскольку он написан в ваша ошибка.

Вы должны получить все колоны с именами, такими как /^store_/ (regexp). И не обновляйте все эти поля, указав их.

mysql> SHOW COLUMNS FROM products where field REGEXP '^store_' 

чем собрать все поля из «Field» ... Вы можете прочитать больше о том, чтобы получить все столбцы here.

+0

Звучит неплохо, я попробую это :) – Jaycaponex

+0

Это работало отлично для меня. Спасибо! – Jaycaponex

5

Вы должны установить каждый столбец в явном виде. SQL не поддерживает подстановочные знаки для имен столбцов (за исключением * для SELECT *):

update products 
    set store_de = 1, 
     store_en = 1, 
     store_fr = 1, 
     store_es = 1, 
     . . . 
    where product_id = ?; 

Ваша структура данных позволяет предположить, что вы действительно хотите ProductStores таблицу. Это будет иметь один ряд для каждого языка (?) И для каждого продукта. Было бы, по крайней мере, три колонки:

  • ProductId
  • Language
  • Value

Тогда вы бы просто сделать:

update ProductStores 
    set Value = 1 
    where ProductId = ?; 
+0

Таблица выше предназначена только для статуса продукта. Он обрабатывает активный или неактивный статус продукта в магазинах. Но у меня есть «таблица языков», поэтому я могу построить запрос из этой таблицы? Возможно два пути: Я динамически строю строку типа: $ culumns = "store_de = 1, store_en = 1, etc"; «UPDATE products SET' $ columns' WHERE product_id =? " Или я могу обновить каждый язык с помощью цикла foreach или while? – Jaycaponex

+0

Спасибо за ответ. :) Это не решение, которое помогло мне, но это был правильный ответ на мой вопрос. – Jaycaponex