За последние 24 часа нас посетил 73791 программист и 10224 робота. Сейчас ищут 2005 программистов ...

Массовое присвоение порядкового номера в таблице базы данных

Тема в разделе "PHP для новичков", создана пользователем markelovdn, 4 окт 2022.

  1. markelovdn

    markelovdn Активный пользователь

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Помогите, разобраться. Не могу понять как можно обновить в таблице каждую запись порядковым номером.
    К примеру выбрал я определенное количество записей и хочу что бы в одно из полей каждой записи проставился порядковый норме. Выбрано 4 записи значит первая запись будет номер 1, вторая 2 и т.д. Вроде простая задача но начал решать и как то не через foreach не через while не получается сделать того что надо.

    Вот примеры как я делаю работаю в ларавел, но создал тему здесь, так как думаю что не имеет эта задача отношения к фрэймворку если не прав извиняюсь, удалю тему и перенесу.

    PHP:
    1. $i = 1;
    2. while($competitors_count > 0) {
    3.     $i++;
    4.     $competitors_count--;
    5.     Competitor::where('competition_id', 28)
    6.         ->update(['lot' => $i]);
    7. }
    понимаю что здесь на каждом проходе цикла в поле lot подставляется значение из $i и в итоге получаем в каждом поле конченое значение переменной $competitors_count

    также пробовал через foreach но кроме как засунуть в него цикл while больше ума не хватило, в итоге результат тоже не тот что надо.
    Или на каждом проходе цикла нужно писать в условие отбора записей из таблицы где поле пустое?
    Заранее благодарю за проявленный интерес к теме.
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.862
    Симпатии:
    657
    Есть же обычный for, а то вы счетчик успеваете увеличить до 2 перед первым обновлением.

    Основная проблема в том, что вы пытаетесь многократно обновлять одну и ту же запись. Нужно менять id, не забывая, что идентификаторы не «линейны», т.е. у вас должен быть заранее подготовлен список идентификаторов.
     
    markelovdn нравится это.
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.862
    Симпатии:
    657
    P.S. Если competition_id=28 – это признак, не имеющий отношения к id записи, то вы будете многократно обновлять все записи с этим признаком. В итоге получите во всех записях с этим признаком макс. значение счетчика.
    --- Добавлено ---
    Кста, может, в мускуле (если это мускул) есть ф-ция-генератор. Но я такой не знаю. Чтобы можно было делать SET lot=GEN() в множественном обновлении.
    --- Добавлено ---
    Можно мускульный оператор CASE использовать. Громоздко, но эффективно.
     
    #3 miketomlin, 4 окт 2022
    Последнее редактирование: 4 окт 2022
    markelovdn нравится это.
  4. markelovdn

    markelovdn Активный пользователь

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Спасибо за ответ. Правильно я понимая, что для решения задачи необходимо каждый раз обращаться к базе за новым массивом элементов, где нужное поле для вставки будет пустое, и уже туда вставлять значение увеличенное на единицу от максимального в массиве?
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.862
    Симпатии:
    657
    Про пустое поле не понял. Но походу придется обновлять всю таблицу по одной записи или блоками по неск. записей. Вообще задача странная. Нафига это?
     
    markelovdn нравится это.
  6. markelovdn

    markelovdn Активный пользователь

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Вот таким образом сейчас пытаюсь решить
    PHP:
    1. //получаю массив элементов по условию
    2. $competitors = Competitor::where('competition_id', 28)->get();
    3.  
    4. //формирую массив элементов из поля lot всех записей
    5.     $competitor_lot = [];
    6.     foreach ($competitors as $competitor)
    7.     {
    8.         $competitor_lot[] = $competitor->lot;
    9.     }
    10.  
    11. //пытаюсь присвоить каждому у кого поле пустое увеличенное на единицу значение от максимального в массиве $competitor_lot
    12.     foreach ($competitors as $competitor)
    13.     {
    14.      $competitor_lotmax = max($competitor_lot);
    15.      $competitor_lotmax++;
    16.  
    17.         if (empty($competitor->lot)) {
    18.             $competitor = Competitor::where('lot', null)->first();
    19.             $competitor->lot = $competitor_lotmax;
    20.             $competitor->save();
    21.         }
    22.     }
    этот код присваивает увеличенное на единицу значение от максимального в массиве $competitor_lot но всем записям с пустым полем lot, а хотелось бы что бы в следующее пустое поле вставлялось новое значение. Где что не так делаю не пойму.
     
  7. markelovdn

    markelovdn Активный пользователь

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    Задача эта для жеребьевки спортсменов. Выбираются спортсмены определенного соревнования и определенной весовой категории, и у кого нет номера жребия т.е поле lot пустое надо присвоить ему необходимый порядковый номер, а точнее тот которого среди спортсменов его весовой категории нет. Ну пока присваиваю увеличиный на единицу максимальный номер который есть в весовой категории, а если в весовой категории нет номер значит присваиваем 1, ну и так далее снова проходимся по массиву ищем первое попавщееся пустое поле lot, ищем максимальный номер жребия, увеличиваем на 1, присваиваем ранее найденному пустому полю.
     
  8. markelovdn

    markelovdn Активный пользователь

    С нами с:
    5 июн 2021
    Сообщения:
    41
    Симпатии:
    0
    PHP:
    1. //получаю массив элементов по условию
    2. $competitors = Competitor::where('competition_id', 28)->get();
    3. //формирую массив элементов из поля lot всех записей
    4.     $competitor_lot = [];
    5.     foreach ($competitors as $competitor)
    6.     {
    7.         $competitor_lot[] = $competitor->lot;
    8.     }
    9. $competitor_lotmax = max($competitor_lot);
    10.  
    11. //пытаюсь присвоить каждому у кого поле пустое увеличенное на единицу значение от максимального в массиве $competitor_lot
    12.     foreach ($competitors as $competitor)
    13.     {
    14.      $competitor_lotmax++;
    15.         if (empty($competitor->lot)) {
    16.             $competitor = Competitor::where('lot', null)->first();
    17.             $competitor->lot = $competitor_lotmax;
    18.             $competitor->save();
    19.         }
    20.     }
    Вот так работает правильно
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.862
    Симпатии:
    657
    Не стесняйтесь использовать доп. таблицы ;)