Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: SQL запросы

  1. #1
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±

    SQL запросы

    Здравствуйте. Столкнулся с некоторыми вопросами, не могу определиться как быть

    1. Существует два запроса, которые никак не связаны между собой и не имеют связывающих между собой ключей.
    Необходимо получить дату (которую я получаю посредством функций MySQL) и выборку с определённой таблице.
    - Хотел бы уместить в один запрос, но, как-то не представляю всего этого. Искал на просторах инета и так-же не нашёл.
    - Или же сделать отдельный запрос на получение даты и отдельный запрос на выборку.

    2. Одно из требований, использовать многопоточные запросы. Необходимо для начала удалить старые данные, а потом создать новые.
    Соответственно, если использовать многопоточные запросы, то гарантии на выполнения последовательно - нет.
    Читал про транзакционные запросы, заинтересовало, но хотелось бы узнать мнение.
    Так-же использую InnoDB, конфликтов не должно быть.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Опиши конкретный пример того, какие данные и в каких таблицах есть, а так же что нужно получить.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  3. #3
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    На счёт 1-го вопроса:

    Будет массив с данными времени срабатывание какого-то ивента. То есть, указываем день недели, время и каждый раз в это время будет проходить ивент. Необходимо показать игроку дату до ивента и предметы, которые выпали с прошлого ивента (таблица event_items (id, event_id, event_item, event_count) , строки с предметами и их количества)

     Получаем дату до первого ивента
    1. enum e_EventRefillTime
    2. {
    3. ERT_WEEKDAY,
    4. ERT_HOURS,
    5. ERT_MINUITES
    6. }
    7.  
    8. new
    9. EventRefillTime[][e_EventRefillTime] =
    10. {
    11. {0, 18, 00} // Каждый понедельник в 18:00
    12. };
    13.  
    14. new
    15. year, month, day,
    16. weekday;
    17.  
    18. getdate(year, month, day);
    19.  
    20. weekday = GetDayOfWeek(year, month, day); // Получили день недели
    21.  
    22. new
    23. cur_event,
    24. cur_day_left = 7,
    25. tmp_day_left;
    26.  
    27. // Получаем первый ивент, который состоится и сколько дней до него осталось
    28. for (new i = 0; i < sizeof EventRefillTime; ++i)
    29. {
    30. tmp_day_left = EventRefillTime[i][ERT_WEEKDAY] - weekday;
    31. tmp_day_left = tmp_day_left < 0 ? tmp_day_left : -(tmp_day_left);
    32.  
    33. if (tmp_day_left < cur_day_left)
    34. {
    35. cur_day_left = tmp_day_left;
    36. cur_event = i;
    37. }
    38. }
    39.  
    40. // Теперь к сегодняшней дате, и времени ивента прибавим сколько дней осталось
    41. mysql_format(mysql, FormatData_512, sizeof FormatData_512, "\
    42. SELECT \
    43. (DATE_ADD(\"%d-%d-%d %02d:%02d:00\", INTERVAL %d DAY)) AS event_date",
    44. year, month, day,
    45. EventRefillTime[i][ERT_HOURS],
    46. EventRefillTime[i][ERT_MINUITES],
    47. cur_day_left
    48. );
    49.  
    50. new
    51. Cache:cache_id = mysql_query(mysql, FormatData_512, true),
    52. event_date[19 + 1];
    53.  
    54. cache_get_value_name(0, "event_date", event_date);
    55.  
    56. cache_delete(cache_id);


    И вот не могу определиться, разбивать на разные запросы и потом их склеивать (сохраняем дату, затем в следующем запросе её склеим со всеми предметами) или же можно как-то сделать одним запросом (правда ничего интересующего не нашёл)

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

    На счёт 2-го запроса:

    Как ивент срабатывает, необходимо удалить старые данные о выпадении и обновить их новыми.
    Необходимо пользоваться лишь многопоточными запросами.
    Так вот проблема в том, что это не гарантирует, что запрос об удалении выполнится ранее запроса с обновлением предметов.

    Есть вариант использовать транзакционные запросы, но как-то не совсем убедительно выглядит, хотелось бы узнать мнение остальных.
    Либо же как-то делать с указанием даты пополнения и уже от неё отталкиваться?
    Последний раз редактировалось execution; 22.10.2020 в 11:47.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Если ты хочешь DELETE-запрос объединить с запросом UPDATE/SELECT, то это невозможно. А если хочешь какие-то другие запросы объединить, то не забывай, что, по факту, это будут всё те же 2 запроса, просто отправленные в одно время и обработанные на стороне MySQL-сервера, прежде чем вернуть тебе результат. Даже всякие UNION-запросы хоть и вернут какой-то общий результат, но MySQL будет генерировать и обрабатывать столько запросов, сколько потребовалось бы вручную генерировать таких запросов для получения того же результата.



    А касаемо всей системы - особо так и не понял что именно ты хочешь сделать. Если тебе нужно сделать срабатывание эвента в конкретное время, то логичнее использовать UNIX-время: с ним и работать проще, и его можно в любой формат конвертировать. Даже оставшееся время до эвента можно прямо в запросе и высчитать.

    Дай примеры нескольких таких эвентов и на примере нескольких игроков опиши все проблемы, которые ты пытаешься решить или функционал, который ты хочешь реализовать. Ибо пока всё выглядит так, что ты всё переусложняешь.
    Последний раз редактировалось DeimoS; 22.10.2020 в 16:33.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  5. #5
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Существует расписание каких-то ивентов, которые указаны в массиве.

    Например, каждый понедельник в 18:00 стартует определённый ивент.

    Необходимо показать диалогом когда будет ивент и чтобы в последний раз выпадало:

    Чтобы узнать когда именно будет ивент (сегодня вторник, значит через 6 дней), решил воспользоваться MySQL запрос.
    Теперь необходимо ниже вывести список выпавших в прошлый раз предметов (могут и не быть).

    Так вот, можно ли это как-то вывести одним запросом или лучше отделить их? При использовании UNION, непонятно, когда будет начинаться вывод списка предметов или же даты? Или же если сначала отправили запрос с датой, потом через UNION соединили второй запрос с получением списка предметов, то 1-я строка обязательно будет дата, а уже все остальные - предметы?

    Информация об старте ивента
    PHP код:
    enum e_EventRefillTime
        
    {
            
    ERT_WEEKDAY,
            
    ERT_HOURS,
            
    ERT_MINUITES
        
    }
     
        new
            
    EventRefillTime[][e_EventRefillTime] = 
            {
                {
    01800// Каждый понедельник в 18:00
            
    }; 
    Запрос на получение даты:
    PHP код:
    new
            
    yearmonthday,
            
    weekday;
     
        
    getdate(yearmonthday);
     
        
    weekday GetDayOfWeek(yearmonthday); // Получили день недели
     
        
    new    
            
    cur_event,
            
    cur_day_left 7,
            
    tmp_day_left;
     
        
    // Получаем первый ивент, который состоится и сколько дней до него осталось
        
    for (new 0sizeof EventRefillTime; ++i)
        {
            
    tmp_day_left EventRefillTime[i][ERT_WEEKDAY] - weekday;
            
    tmp_day_left tmp_day_left tmp_day_left : -(tmp_day_left);
     
            if (
    tmp_day_left cur_day_left)
            {
                
    cur_day_left tmp_day_left;
                
    cur_event i;
            }
        }
     
        
    // Теперь к сегодняшней дате, и времени ивента прибавим сколько дней осталось
        
    mysql_format(mysqlFormatData_512sizeof FormatData_512"\
            SELECT \
                (DATE_ADD(\"%d-%d-%d %02d:%02d:00\", INTERVAL %d DAY)) AS event_date"
    ,
                
    yearmonthday,
                
    EventRefillTime[i][ERT_HOURS], 
                
    EventRefillTime[i][ERT_MINUITES],
                
    cur_day_left
            
    );
     
        new
            
    Cache:cache_id mysql_query(mysqlFormatData_512true),
            
    event_date[19 1];
     
        
    cache_get_value_name(0"event_date"event_date);
     
        
    cache_delete(cache_id); 
    - - - Добавлено - - -

    И т.к. я показываю в диалоге дату ивента и последние выпавшие предметы, то каждый раз при срабатывание этого же ивента - старые удалить и добавить новые. Но используется многопоточные запросы. И когда буду удалять старые предметы, а затем добавлять новые - нет гарантий, что запрос на удаление придёт раньше, чем на добавление. Как в этом случае лучше быть?
    Последний раз редактировалось execution; 22.10.2020 в 17:04.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Если ты будешь выгружать и дату, и предметы одним запросом, то найденная дата будет добавляться к каждой строке предметов. Хотя это и не страшно.

    Тебе никакие UNION тут не нужны. Достаточно будет обратиться к нескольким таблицам сразу и выгрузить нужные данные. Покажи как ты хранишь данные в таблицах и напиши какие данные тебе нужны.

    Касаемо вопроса с удалением - отправляй его через mysql_query и всё. Задержка не будет сколько-либо существенной, чтоб бояться вызова этой функции несколько раз в неделю для каждого игрока.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  7. Пользователь сказал cпасибо:
    execution (22.10.2020)
  8. #7
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Таблица, где хранятся предметы выпавшие с ивента: event_items (INT id, INT event_id, INT event_item, INT event_count).
    То есть, мне сразу необходимо выгрузить все event_item, event_count в event_id и отдельно сгенерированную дату (которую я выше описывал).
    Второй таблицы нет

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

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

    1. SELECT (DATE_ADD(\"%d-%d-%d %02d:%02d:00\", INTERVAL %d DAY)) AS event_date, * FROM event_items WHERE event_id = %d

    Этот запрос выгрузит все данные о конкретном эвенте и высчитает дату.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    execution (22.10.2020)
  11. #9
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Да, что-то не доходило. Спасибо
    Последний раз редактировалось execution; 23.10.2020 в 08:05.

  12. #10
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    А если event_items пустой?
    Я думаю будет выгодно сделать, если получать unix_timestamp для каждого времени ивента при загрузке мода и не мучать жопу.
    Последний раз редактировалось execution; 23.10.2020 в 09:17.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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