Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±

    Поиск наименьшего свободного значения для столбца [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_stringsizeof(query_string), "SELECT MIN(%s) AS free_id FROM %s"columnnametablename);  
        new 
    Cache:result mysql_query(mysql_connect_IDquery_string);  
        
    cache_get_value_name_int(0"free_id"free_id);  
        
    cache_delete(result);  
          
        if(
    free_id != 1)   
            return 
    1;  
        else  
        {  
            
    format(query_stringsizeof(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"columnnametablenametablenamecolumnnamecolumnnamecolumnname); 
            
    result mysql_query(mysql_connect_IDquery_string);  
            
    cache_get_value_name_int(0"free_id"free_id);  
            
    cache_delete(result);  
            return 
    free_id;  
        }  


    Примечание:
    Крайне НЕ рекомендуется использовать данную функцию для больших таблиц (таблиц, с большим числом строк).
    Поиск свободного ID производится путём перебора значений от минимального к максимального и, допустим, если у Вас в таблице более миллиона записей, сами понимаете, запрос может обрабатываться приличное количество времени.
    Поэтому если и потребуется использовать данную функцию для больших таблиц, постарайтесь минимизировать частоту вызовов этой функции (не стоит её пихать в секундный таймер, если не хотите проблем).

    Автор:
    DeimoS
    Последний раз редактировалось DeimoS; 31.07.2019 в 15:29.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. 5 пользователя(ей) сказали cпасибо:
    Blood (29.12.2016) Geebrox (30.12.2016) oukibt (28.06.2020) Salik_Davince (29.12.2016) [ForD] (30.12.2016)
  3. #2
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Большое спасибо, уж очень долго сам перечитывал документацию но не находил выход для A_I.

  4. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Но представим, что нам, по какой-либо причине, аккаунт нужно создать под свободным ID (3 и 6), а не под самым большим.
    Вот тут и пригодится эта функция, которая в как раз и вернёт значение "3".
    Честно говоря, ума не приложу кому такое может придти в голову. Если кто-то будет использовать - напишите для чего, интересно.

  5. Пользователь сказал cпасибо:
    Guldan (30.12.2016)
  6. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Честно говоря, ума не приложу кому такое может придти в голову. Если кто-то будет использовать - напишите для чего, интересно.
    Это был лишь пример, который первый в голову пришёл. Не самый удачный, но самый понятный для большинства, как мне кажется :)

    Я писал эту функцию для таблицы с рангами для админов.
    Точнее, я писал систему, позволяющую создавать ранги прямо из игры и номер строки в таблице означал уровень админки.
    Но чтоб каждый раз не писать этот уровень самостоятельно и не держать существующие номера в голове, я добавил возможность не указывать его и тогда уже эта функция сама подберёт свободный ID.
    Если просто использовать AUTO_INCREMENT, то будет как-то глупо выглядеть, если всего будет 10 рангов, но их уровни будут, например, "1", "5", "13", "14", "22" и т.п.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Точнее, я писал систему, позволяющую создавать ранги прямо из игры и номер строки в таблице означал уровень админки.
    Но чтоб каждый раз не писать этот уровень самостоятельно и не держать существующие номера в голове, я добавил возможность не указывать его и тогда уже эта функция сама подберёт свободный ID.
    Если просто использовать AUTO_INCREMENT, то будет как-то глупо выглядеть, если всего будет 10 рангов, но их уровни будут, например, "1", "5", "13", "14", "22" и т.п.
    Как по мне ID (private key) - это исключительно внутренняя информация, и его вообще нигде не нужно отображать. Можно было просто создать поле для обозначения уровней.

  8. #6
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Честно говоря, ума не приложу кому такое может придти в голову. Если кто-то будет использовать - напишите для чего, интересно.
    Авто удалению старых аккаунтов на глобальном проекте и их заменой на новые такая система пригодилась бы.
    Не всегда же охота ковыряться в бд с несколькими тысячами аккаунтов и перебирать их отсеивать там удалять,
    вот она автоматизированная система, не много нагрузки только прибавится.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  9. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Авто удалению старых аккаунтов на глобальном проекте и их заменой на новые такая система пригодилась бы.
    Не всегда же охота ковыряться в бд с несколькими тысячами аккаунтов и перебирать их отсеивать там удалять,
    вот она автоматизированная система, не много нагрузки только прибавится.
    Что мешает просто периодически удалять все аккаунты, с которых заходили более N дней назад?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Как по мне ID (private key) - это исключительно внутренняя информация, и его вообще нигде не нужно отображать. Можно было просто создать поле для обозначения уровней.
    Я изначально немного солгал, ибо забыл как всё было устроено :D
    Как раз столбец, обозначающий номер строки, никак не "фильтруется" со стороны сервера и его определяет лишь БД.
    Для номера ранга имеется отдельный столбец, который я как раз и форматировал этой функцией.
     Как-то так выглядела первая версия таблицы для этой системы

    Потом придумал совсем дугой алгоритм работы админки, а тот скрипт забросил.
    Форматировался столбец с именем "rank_id"


    - - - Добавлено - - -

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Что мешает просто периодически удалять все аккаунты, с которых заходили более N дней назад?
    Так он про это и говорит, как я понимаю. Просто он хочет либо отсортировать все аккаунты по новой (что странно, ибо придётся править и другие таблицы), либо новые аккаунты записать на место удалённых (от чего польза лишь в том, что глазу приятнее. Да и то не каждому)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •