Массовое обновление нескольких условий в SQL и PHP - PullRequest
0 голосов
/ 28 августа 2009

Если я хочу обновить базу значений столбца при условии, я могу просто использовать приведенный ниже запрос для случая simpel +1 -1 (конечно, перевести на правильный вызов PHP или эквивалент ORM):

UPDATE articles SET STATUS = 0 WHERE STATUS  = 1;

Но теперь проблема в том, что я хочу, исходя из оригинала status, вывести новое значение status из словаря. Предполагая, что словарь выглядит примерно так:

dict['1']='3'
dict['12']='2'
dict['6']='2'

Нет никакой связи между парой ключ-значение. dict - это объект словаря PHP, это то, что я имел в виду под "in memory dictionary".

Как написать этот запрос?

Редактировать: Редактировать вопрос. Я не правильно сформулировал вопрос ... извините!

Ответы [ 4 ]

4 голосов
/ 28 августа 2009

Если у вас небольшое количество отображений, вы можете использовать оператор case.

BEGIN TRAN

UPDATE articles
SET status = 
       case 
          when status=1 then 3 
          when status=12 or status=6 then 2 
          else status --leave it unchanged if it doesn't match a case
       end

--COMMIT OR ROLLBACK

В противном случае используйте подход таблицы сопоставления, предложенный rwmnau

1 голос
/ 28 августа 2009

Поскольку ваш вопрос неясен и вы, похоже, смешиваете код и SQL, вы можете сделать что-то вроде этого (псевдо-Java):

StringBuilder sb = new StringBulder();

for (Map.Entry<Integer,Integer> entry : codes.entrySet) {

    sb.append(
      String.format("UPDATE articles SET Status=%s WHERE Status=%s\n", entry.getValue(), entry.getKey() 
       );

}

String sqlToExecute = sb.toString();
System.out.println(sqlToExecute);

Это даст вам SQL для выполнения изменений. Если этот код будет более единичным, то избавьтесь от форматирования String и используйте вместо этого подготовленные операторы.

1 голос
/ 28 августа 2009

Как насчет этого:

UPDATE articles
   SET status = n.new
  FROM articles a
  JOIN NewStatus n
    ON a.status = n.status

Таким образом, у вас будет вторая таблица с именем «NewStatus», имеющая два столбца - один с именем «status» с вашим существующим статусом, а другой с «New», у которого есть статус, который вы хотите обновить. Присоединитесь к этой таблице, сделайте свое обновление, и это должно решить это. Кроме того, если есть какие-либо статусы, которые вы не хотите обновлять, просто не включайте их в таблицу NewStatus - тогда они будут пропущены в операторе обновления.

Похоже, вопрос был изменен, поэтому, если я упускаю суть, пожалуйста, дайте мне знать!

1 голос
/ 28 августа 2009

Использовать подзапрос:

UPDATE articles AR SET status = (SELECT value FROM dict WHERE key = AR.status)

Конечно, я предполагаю, что в вашей базе данных хранится словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...