update нескольких строк один запросом

Тема в разделе "Базы данных", создана пользователем Dziamid, 12 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Dziamid

    Dziamid Создатель

    Регистр.:
    8 окт 2008
    Сообщения:
    11
    Симпатии:
    0
    $arr = array(1,3,2,4,5,6);
    $i = 0;
    foreach ($arr as $id) {
    $i++;
    $res = $mdb2->exec("UPDATE table SET index = $i WHERE id = $id")
    }
    Как сделать тоже самое одним запросом???

    Добавлено через 25 минут
    Т.е. нужно что-то вот такое:
    UPDATE table SET index = INC(1) ORDER BY index, где
    INC() - придуманная мной функция mysql которая увеличивает число при каждом фактическом абдейте строки
    Кто-нибудь делал что-нибудь подобное?
     
  2. Kloster

    Kloster

    Регистр.:
    22 июн 2009
    Сообщения:
    216
    Симпатии:
    12
    не пойму, при чем здесь увеличение числа?
    в массиве $arr = array(1,3,2,4,5,6); числа идут не по порядку, я решил. что это фиксированно заданные значения.
    Или нужно просто в базе поле инкрементировать? Подробнее опиши задачу.
     
  3. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    ... WHERE id IN(/* тут список значений через запятую */)
    и пофиг по порядку или нет
     
  4. dohtar

    dohtar Писатель

    Регистр.:
    28 ноя 2008
    Сообщения:
    7
    Симпатии:
    1
    как я понял, речь про сохранение приоритета сортировки для каких-то объектов
    я тоже делаю это с помощью нескольких запросов в цикле, т.е. именно тот вариант, от которого вы хотите отказаться
     
  5. Laba

    Laba Создатель

    Регистр.:
    27 сен 2009
    Сообщения:
    18
    Симпатии:
    2
    Может попробывать так:
    1. делаем таблицу, например:
    create table x( id int(10), order_no int(10)) ;
    2. добавляем в неё записи с id и порядком следования
    insert into x values (1, 1);
    insert into x values (3, 2);
    insert into x values (2, 3);
    insert into x values (4, 4);
    insert into x values (5, 5);
    3. делаем update с вызовом супер функции inc()
    UPDATE a, x SET a.id = inc(1) WHERE a.id = x.id order by x.order_no
     
  6. AndreyD2

    AndreyD2

    Регистр.:
    21 окт 2008
    Сообщения:
    195
    Симпатии:
    67
    Можно составить один большой запрос

    UPDATE table SET index = 1 WHERE id = 1:
    UPDATE table SET index = 2 WHERE id = 3;
    ...
     
  7. Laba

    Laba Создатель

    Регистр.:
    27 сен 2009
    Сообщения:
    18
    Симпатии:
    2
    Он не составляет один запрос, а методично в цикле отправляет в базу по одному :)
     
  8. zzxc

    zzxc Создатель

    Регистр.:
    27 дек 2007
    Сообщения:
    10
    Симпатии:
    3
    Зависит от того, что вам нужно сделать.

    Если провести одну и ту же операцию над всеми строками, например прибавить одно и то же число или вызвать функцию, достаточно сделать UPDATE ... WHERE id IN (1,3,2,4,5,6).

    Если нужно проапдейтить значения полей на своё значение для каждой строки, в MySQL для этого есть такой синтаксис:

    INSERT ...
    ON DUPLICATE KEY UPDATE id=VALUES(id)
     
Статус темы:
Закрыта.