15 запросов update в один

Тема в разделе "Базы данных", создана пользователем Acidrayne, 17 апр 2011.

Модераторы: latteo
  1. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    Добрый день подскажите у меня есть запрос типа:

    PHP:
    mysql_query("UPDATE planet SET ruda =ruda + 100 WHERE lvl = 1");
    В игре 15 уровней, ресурсы добаляются разное колличество в зависимоти от уровня, возможно ли объединить 15 запросов в один, в зависимости от уровня!
     
  2. best

    best

    Регистр.:
    12 апр 2006
    Сообщения:
    246
    Симпатии:
    54
    ты хочешь чтобы прошли 15 запросов с lvl = 1 2 3... Или ты хочешь чтобы зарос менялся в зависимости от уровня?
     
  3. DrakonHaSh

    DrakonHaSh

    Регистр.:
    29 июн 2010
    Сообщения:
    358
    Симпатии:
    122
    Код:
    UPDATE planet SET ruda = ruda +
    CASE lvl
      WHEN 1 then 100
    ...
      WHEN 15 then 10
      ELSE 0
    END
    
     
    Acidrayne нравится это.
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    если зависит от уровня значит какая-то формула расчёта есть, тогда надо всю формулу в запрос подставить, например

    PHP:
    mysql_query("UPDATE planet SET ruda =ruda + 100*lvl");  
     
    Acidrayne нравится это.
  5. skn78

    skn78 Создатель

    Регистр.:
    14 апр 2007
    Сообщения:
    21
    Симпатии:
    0
    если выполнять множество запросов на обновление в одной транзакции,
    они будут выполняться быстрее в разы.
     
  6. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    спасибо всем за ответы, у меня неделю небыло интернета, поэтому я не мог сюда зайти!

    не могли бы вы ответить поконкретнее ?
     
  7. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Нужно использовать таблицы, поддерживающих транзакции: InnoDB, BDB.

    Формат следующий:
    PHP:
    START TRANSACTION
    UPDATE accounts SET Sum Sum 10 WHERE Number 123
    UPDATE accounts SET Sum Sum 10 WHERE Number 67
    COMMIT;
    START TRANSACTION - начало транзакции,
    COMMIT - конец транзакции.
    Если в процессе запросов вылезли ошибки, то отбновление таблиц не пройизодет.
    Между этими командами вставляются нужные запросы.

    p.s. На счет выигрыша в скорости не особо уверен. Сам не пользуюсь.
     
    Acidrayne нравится это.
  8. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    lvl в данном случае можно брать из этой же таблицы, или его нужно учитывать отдельно ?
     
  9. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    да можно брать все значения из текущей обновляемой строки в таблице
    Код:
    UPDATE planet SET tree = tree + 1, ruda = tree*10/round((lvl+1)/2)
    
    также и комбинации таблиц
    Код:
    UPDATE planeta p, user u SET p.ruda=p.ruda+10*u.lvl
    WHERE p.user_id=u.id;
    
    математические функции

    http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html
     
  10. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20

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