Здравствуйте. Вопрос простой и короткий: Как правильно найти самый первый свободный id из таблицы БД? --- Добавлено --- ЗЫ желательно без ополнительных таблиц
Есть таблица с несколькими колонками, первая из которой id. Если есть свободный элемент (1,2,4,5,6,7), то нужно получить его номер (в данном случае 3)
id без автоинкремента у меня, но мне надо находить свободные id для удобства. Пользователь должен сам выбирать id
Как? Каким циклом лучше это делать? А то я если сделаю, то любой увидивший этот код скажет "Из какой жопы его родили)"
это не стандартная задача, по этому выбирай из таблицы какое то количество данных, а точнее только id ну а дальше..
Ну раз пользователь выбирает 5, ты проверяешь, есть ли в базе ID с номером 5 если нету, даёшь пользователю его присвоить себе, если занято, говоришь что занято, пусть выбирает другое.
Не, вы не совсем правильно поняли, Нужно именно рекомендовать пользователю первый свободный id, а не проверять тот что он уже ввёл. Хотя этой идеей я тоже воспользуюсь.
ну а что значит рекомендовать, а вдруг пока ты ему "рекомендуешь", его уже займут? PS ты сначала обращается к БД получаешь все доступные и ему предлагаешь.
Ну да, об этом не было речи. Тогда сделай отдельную таблицу, где будешь записывать свободные диапазоны.
Никто не займёт. Это всё происходит в админпанели, и админ будет только 1, ну или несколько. Так что об этом переживать точно не нужно. --- Добавлено --- --- Добавлено --- Все доступные это 3 и от 11 до бесконечности?? Длинноватый цикл будет))
зачем цикл, ты из БД берешь все ID, только ID, начиная с 1 до 1000 допустим и потом уже в РНР при помощи цикла перебираешь, что тут такого.
Ну так, а ты сразу сказал "Все доступные"))) --- Добавлено --- Ну да ладно. Сейчас попробую. Спасибо. --- Добавлено --- Соорудил я вот такую конструкцию: Код (PHP): if (@mysql_num_rows ($result)){ while($date_array = mysql_fetch_array ($result)) { $arr[] = $date_array['id']; } for ($i = 0; $i < count ($arr); $i++){ if ($arr[$i + 1] - $arr[$i] > 1){ $free_id = $arr[$i]; break; } } } else $free_id = 1; Но вместо свободного она возвращает id тот который перед свободным. А если меняю $free_id = $arr[$i] на $free_id = $arr[$i + 1] то следующий.
@SamyRed, чтобы рекомендовать первый свободный, надо все записи получить, проверить идентификаторы, определить какой самый первый отсутствующий по порядку id потом его рекомендовать. Как - то накладно получается, если у тебя в базе будет очень много записей.
Всё. Нашёл. Я вместо номера свободного ид возвращал тот ид, который уже есть в базе. Всем спасибо. Всё получилось. --- Добавлено --- В базе бдет порядка 10-ти записей. Так что не накладно)
Меня сейчас закидают гнилыми помидорами, но можно сделать так: PHP: $result = mysqli_query($db, "SELECT 'id' FROM table ORDER BY 'id'"); $row = mysqli_fetch_array($result, MYSQLI_ASSOC); $i=0; a: $row = mysqli_fetch_array($result, MYSQLI_ASSOC); if ($i == $row['id']) { $i++ goto a; } else { $freeId = $row['id']; } // $freeId - первый свободный ID Логика, думаю, ясна. Можешь реализовать по своему. Не знал как выйти из цикла, поэтому написал ручной цикл...
Давно я goto не видел))) --- Добавлено --- Вернее ни разу не видел)))) --- Добавлено --- Колонки таблицы, вроде, выделяются знаками ``. а '' это для значений.
@mr.akv это не мой случай. Лучше объясните чем плох goto? О нем я узнал еще в QBasic и Turbo Pascal. Но что в нём такого плохого и смешного - вообще не понимаю... З,Ы, как всё предсказуемо...
@TeslaFeo, представь, какая каша в коде может получиться, если использовать goto в больших программах?)