Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Функция Поиск наименьшего свободного значения для столбца [GetFreeTableNumber]

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.​

Код:
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​
 
Сверху Снизу