Поиск наименьшего свободного значения для столбца [GetFreeTableNumber]
Описание:
Функция отправляет запрос в указанную таблицу и возвращает наименьшее свободное значение указанного столбца.
Пояснение: Возьмём в пример таблицу с аккаунтами "account", в которой есть столбец "id", хранящий в себе порядковый номер аккаунта и имеющий атрибут "AUTO_INCREMET".
Сейчас в таблице имеются 5 аккаунтов:
Открыть/закрыть id |
player_name |
1 |
Vasya_Pupkin |
2 |
Nagibator_1337 |
4 |
My_Name_Is_Skrillex |
5 |
SuperScripter |
7 |
MamaHeXotelLa_5a5aHeCtapalLc9 |
Если мы попробуем создать новый аккаунт, он автоматически создастся под ID 8 (если Вы не трогали настройки AUTO_INCREMENT).
Но представим, что нам, по какой-либо причине, аккаунт нужно создать под свободным ID (3 и 6), а не под самым большим.
Вот тут и пригодится эта функция, которая в как раз и вернёт значение "3".
Параметры:
const tablename[20] - Название таблицы, в которой будет происходить поиск (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)
const columnname[20] - Имя столбца, в котором будет происходить поиск свободного ID (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)
Возвращаемое значение:
Первое свободное значение, начиная с 1.
Код:
Открыть/закрыть
PHP код:
stock GetFreeTableNumber(const tablename[20], const columnname[20])
{
new query_string[106+(sizeof(columnname)*4)+(sizeof(tablename)*2)+1],
free_id;
format(query_string, sizeof(query_string), "SELECT MIN(%s) AS free_id FROM %s", columnname, tablename);
new Cache:result = mysql_query(mysql_connect_ID, query_string);
cache_get_value_name_int(0, "free_id", free_id);
cache_delete(result);
if(free_id != 1)
return 1;
else
{
format(query_string, sizeof(query_string), "SELECT %s+1 AS free_id FROM %s AS a1 WHERE (SELECT 1 FROM %s AS a2 WHERE a2.%s=a1.%s+1) IS NULL ORDER BY a1.%s LIMIT 1", columnname, tablename, tablename, columnname, columnname, columnname);
result = mysql_query(mysql_connect_ID, query_string);
cache_get_value_name_int(0, "free_id", free_id);
cache_delete(result);
return free_id;
}
}
Примечание:
Крайне НЕ рекомендуется использовать данную функцию для больших таблиц (таблиц, с большим числом строк).
Поиск свободного ID производится путём перебора значений от минимального к максимального и, допустим, если у Вас в таблице более миллиона записей, сами понимаете, запрос может обрабатываться приличное количество времени.
Поэтому если и потребуется использовать данную функцию для больших таблиц, постарайтесь минимизировать частоту вызовов этой функции (не стоит её пихать в секундный таймер, если не хотите проблем).
Автор:
DeimoS