DeimoS
29.12.2016, 21:44
Описание:
Функция отправляет запрос в указанную таблицу и возвращает наименьшее свободное значение указанного столбца.
Возьмём в пример таблицу с аккаунтами "account", в которой есть столбец "id", хранящий в себе порядковый номер аккаунта и имеющий атрибут "AUTO_INCREMET".
Сейчас в таблице имеются 5 аккаунтов:
idplayer_name
1Vasya_Pupkin
2Nagibator_1337
4My_Name_Is_Skrillex
5SuperScripter
7MamaHeXotelLa_5a5aHeCtapalLc9
Если мы попробуем создать новый аккаунт, он автоматически создастся под ID 8 (если Вы не трогали настройки AUTO_INCREMENT).
Но представим, что нам, по какой-либо причине, аккаунт нужно создать под свободным ID (3 и 6), а не под самым большим.
Вот тут и пригодится эта функция, которая в как раз и вернёт значение "3".
Параметры:
const tablename[20] - Название таблицы, в которой будет происходить поиск (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)
const columnname[20] - Имя столбца, в котором будет происходить поиск свободного ID (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)
Возвращаемое значение:
Первое свободное значение, начиная с 1.
Код:
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
Функция отправляет запрос в указанную таблицу и возвращает наименьшее свободное значение указанного столбца.
Возьмём в пример таблицу с аккаунтами "account", в которой есть столбец "id", хранящий в себе порядковый номер аккаунта и имеющий атрибут "AUTO_INCREMET".
Сейчас в таблице имеются 5 аккаунтов:
idplayer_name
1Vasya_Pupkin
2Nagibator_1337
4My_Name_Is_Skrillex
5SuperScripter
7MamaHeXotelLa_5a5aHeCtapalLc9
Если мы попробуем создать новый аккаунт, он автоматически создастся под ID 8 (если Вы не трогали настройки AUTO_INCREMENT).
Но представим, что нам, по какой-либо причине, аккаунт нужно создать под свободным ID (3 и 6), а не под самым большим.
Вот тут и пригодится эта функция, которая в как раз и вернёт значение "3".
Параметры:
const tablename[20] - Название таблицы, в которой будет происходить поиск (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)
const columnname[20] - Имя столбца, в котором будет происходить поиск свободного ID (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)
Возвращаемое значение:
Первое свободное значение, начиная с 1.
Код:
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