Задать вопрос
  • Как отслеживать и выводить обновления базы данных?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Есть ли другие способы как реализовать мою задумку или оптимизировать уже имеющийся?

    Да цельный воз и маленькая тележка.

    Обычно у каждой записи в БД имеется поле, в котором регистрируется штамп времени создания и/или последнего обновления записи. Так что всего и делов - запомнить, когда последний раз обращались к БД, и в следующий раз запросить те записи, что изменены позже. MySQL позволяет получать штамп времени с точностью до микросекунды.

    Или уж совсем по-простому. В каждой таблице держим синтетический первичный ключ-автоинкремент, и по аналогичной схеме запоминаем, каким было максимальное значение при предыдущем обращении.
    Ответ написан
    Комментировать
  • Как определить игрока быстрее всех нажавшего кнопку (web)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Я вижу решение, близкое к желаемому.

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

    Далее, уже в момент нажатия, по той же технологии передаётся пакет с точным клиентским временем нажатия, и по подсчитанной ранее разности определяется точное время нажатия по времени сервера. Для всех клиентов это время сравнивается, и победителем объявляется тот, у кого время нажатия по серверу минимальное.

    Такой алгоритм (практически) не зависит от колебания времени доставки пакета от клиента серверу.

    Калибровка разности времени при необходимости может повторяться. Частота рекалибровки зависит достижимой точности определения локального и серверного времени и от требуемой точности вычисления разности. По моим очень приблизительным прикидкам, если требуемая точность составляет 100 мс, то рекалибровку следует проводить ежечасно.

    Если после 2-3 повторений калибровки установить точное значение разности не удалось - клиенту следует отказать в участии.
    Ответ написан
    6 комментариев
  • Объясните пожалуйста как работает пинг?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Добавлю к вышесказанному.

    Пинг меряет вовсе не время передачи между исходным и конечным узлами. Показываемое время в основном уходит на обработку пинга как промежуточными узлами (после приёма надо решить, куда отправлять, а это время), так и конечным узлом (получив пинг, надо сформировать и отправить понг). А если какой-то из этих узлов сильно загружен, то и пинг получится немаленьким (но больше всего может отличиться конечный узел - ответ на пинги имеет крайне низкий приоритет, и узел будет формировать ответ в самую последнюю очередь, лишь переделав всё остальное).

    Так что маршрут в 20 хопов имеет более высокий шанс показать большее время пинга по сравнению с маршрутом в 10 хопов, даже если он физически и короче.
    Ответ написан
    Комментировать
  • Как написать относительный путь в конфиге MySQL my.ini?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как сделать в главном конфиге сервера MySQL относительные пути?

    Никак. Относительный путь требует наличия и, главное, детерминированности базового пути, от которого будет выполнен относительный отсчёт. А вот этой детерминированности гарантировать, увы, невозможно.

    Хотелось бы примерно такое (добавить переменную %BASEDIR%)

    Ну сделайте отдельный маленький конфигурационный файл с развёрнутыми путями, подключаемый инструкцией !include, и скриптик, который переформирует этот файл по введённой базовой директории.
    Ответ написан
  • Как из массива получить данные поля cli_codes pl/sql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Навскидку как-то так:

    SELECT *
    FROM JSON_TABLE(cReq, 
                    '$' COLUMNS ( dep_id NUMBER(10) PATH '$.dep_id',
                                  id NUMBER(10) PATH '$.id',
                                  cli_codes varchar2(500) FORMAT JSON PATH '$.cli_codes'
                                  )
                    ) jsontable

    JSON_TABLE() function
    Ответ написан
    1 комментарий
  • Как из полученного массива получить данные?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ответ написан
    Комментировать
  • Макросов VBA Excel?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Адреса диапазонов в константу, в коде парсим и используем.
    Const Addresses As String = "E7:E14,F7:F14,G7:G14,G21:G108,H7:H14"
    
    Sub ...
    ...
    For Each RangeAddress In Split(Addresses, ",")
        Workbooks("srcX.xlsx").Sheets("SheetY").Range(RangeAddress).Copy Workbooks("dst.xlsx").Sheets("SheetZ").Range(RangeAddress)    
    Next


    Адреса диапазонов назначения тоже могут быть собраны в константу. А для обработки нескольких файлов дополнительно считать смещение и задействовать метод Range.Offset.
    Ответ написан
    1 комментарий
  • В какой базе данных лучше всего хранить данные для дашбордов?

    @Akina
    Сетевой и системный админ, SQL-программист.
    а что делать с реляционной бд

    А ничего. НЕ хранить ежедневные итоги. Только приходы и уходы. И самая первая запись - только приход (начальный баланс), если начинаем не с пустой кассы. А сумму с накоплением считаем непосредственно в запросе, в тот момент, когда потребовался отчёт.

    Ну или как вариант - хранить в отдельной таблице базовую сумму (начальный баланс периода), скажем, на начало месяца или там года, и от неё уже начинать считать.
    Ответ написан
    1 комментарий
  • Как выбрать расстояние до веб сервера?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Какое должно быть расстояние до веб севера, чтобы запроса гарантировано шел прямо к нему . Без промежуточных серверов. Тогда можно будет рассчитать время ответа сервера.

    Без промежуточных? Расстояние - в пределах домена коллизий.
    Однако даже в таком случае расчёт времени невозможен. Например, оно может увеличиться (и сильно), если перестраивается RSTP.
    Ответ написан
  • Как получить количество первичных записей в таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если принять такую формулировку:

    Первичным является товар, одновременно с которым куплено больше всего других товаров

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

    WITH cte AS (
        SELECT t1.cat_id, RANK() OVER (ORDER BY COUNT(t2.cat_id) DESC) rnk
        FROM user_to_cat t1
        JOIN user_to_cat t2 ON t1.user_id = t2.user_id
                           AND t1.cat_id <> t2.cat_id
        GROUP BY 1
        )
    SELECT category.code
    FROM cte
    JOIN category ON category.id = cte.cat_id
    WHERE rnk = 1

    На данных из fiddle запрос даст 2 товара - orange и pear, оба они участвуют в 6 парах, тогда как apple участвуют в 4, а lemon в 2 парах.
    Ответ написан
  • Как составить запрос выборки баллов?

    @Akina
    Сетевой и системный админ, SQL-программист.

    Мне нужно найти запись на который у пользователя где у пользователя 1 накопится допустим 30 баллов, это запись id=5.


    WITH cte AS (
        SELECT *, SUM(point) OVER (ORDER BY point_lifetime) cum_sum
        FROM tablename
        WHERE user_id = 1 --   у пользователя 1 
        )
    SELECT *
    FROM cte
    WHERE cum_sum >= 30   --   накопится 30 баллов
    ORDER BY point_lifetime LIMIT 1;


    PS. Поскольку значения в point_lifetime неуникальны, то однозначного решения может и не быть. Во всяком случае до тех пор, пока не будет точно определён порядок записей при равенстве значений этого поля.
    Ответ написан
    Комментировать
  • Как изолировать 2 сегмента с помощью VLAN на оборудовании Cisco, чтобы они оба имели выход в третий?

    @Akina
    Сетевой и системный админ, SQL-программист.
    VLAN тут не помощник.

    В условиях, когда все три узла подключены к одному коммутатору, спасти может только запрет форвардинга с порта Fa0/1 на Fa0/2 и обратно - если такая возможность в коммутаторе вообще есть. По-русски это обзывается "Изолированный режим". Не знаю как он обзывается у Циски - а, например, в D-Link это называется Traffic Segmentation. И выглядит вот так:

    6564623ea9bac451405414.png

    UPDATE.

    Вроде у сиськи он обзывается так же. См. https://www.cisco.com/c/en/us/products/security/wh...

    То есть просто находишь сию настройку, включаешь сегментацию, и разрешаешь Fa0/1 форвардить только на Fa0/3, то же для Fa0/2, а вот Fa0/3 разрешаешь форвардинг и на Fa0/1, и на Fa0/2.

    Само собой все три порта должны быть в одном VLAN.
    Ответ написан
    Комментировать
  • В чем разница между функцией и триггером?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Функция - это хранимый объект, который производит указанные действия по факту явного вызова, и возвращает вычисленный результат, тип которого описан в тексте функции. Код функции может также модифицировать и другие объекты.

    Триггер - это хранимый объект, который описывает реакцию на указанное событие. Обычно это событие изменения данных (удаление, вставка, обновление данных таблицы), реже (и не в каждой СУБД поддерживается) событие изменения метаданных (создание, изменение или удаление хранимых объектов или модификация их свойств). Данная реакция заключается в выполнении соответствующего кода (триггерной процедуры либо триггерной функции, зависит от СУБД). Выполняемый код может модифицировать как сами изменяемые объекты, действие над которыми вызвало срабатывание триггера (т.е. модифицировать выполняемые модификации), так и другие объекты. Триггер сам по себе ничего и никуда не возвращает, триггерная процедура тоже ничего не возвращает, триггерная функция - возвращает обновлённое состояние объекта, действие с которым вызвало срабатывание триггера.
    Ответ написан
    Комментировать
  • Как сделать верную группировку в Union?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT id, MIN(type) type
    FROM t1
    WHERE type IN (1, 2)
    GROUP BY id
    Ответ написан
    4 комментария
  • Стоит ли переноносить таблицу из базы mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MySQL глубоко параллельно, в какой БД лежит таблица (надеюсь, innodb_file_per_table включен?). Посему вынос таблицы в отдельную БД не окажет вообще никакого влияния на работу системы. Разве что незначительно изменится процент кэширования - но скорее всего это даже детектировать не выйдет.

    Если это высоконагруженная таблица с большим потоком запросов на изменение, то имеет смысл для неё создать отдельный tablespace и вынести его на быстрый (SSD) раздел. Плюс согласен с Everything_is_bad - партиционирование (в зависимости от вида основного шаблона запросов в потоке - по юзеру или по дате) может способствовать оптимизации работы с таблицей.
    Ответ написан
    Комментировать
  • Как распределить число равномерно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Обычный подход - тупо:

    Количество(Склад Номер Х) = ВсегоТовара * НомерСклада / ВсегоСкладов - Количество(Склады Номер 1 .. Х-1)


    Т.е. если, как в вопросе, три склада и 5 товаров:

    Склад 1: количество = 5 * 1 / 3 - 0 = 1,666 = 2 штуки
    Склад 2: количество = 5 * 2 / 3 - 2 = 1,333 = 1 штука
    Склад 3: количество = 5 * 3 / 3 - (2 + 1) = 1,666 = 2 штуки


    $amount = 5;
    $num = 3;
    
    for($used = 0, $i = 1; $i <= $num; $i++) {
      $used += ($current = round($amount * $i / $num - $used));
      echo("$i: $current\n");
    }


    https://phpize.online/sql/mysql57/undefined/php/ph...
    Ответ написан
  • Как можно оптимизировать SQL запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    насколько оптимально такое решение?

    Представление в Постгрессе - чисто динамическая конструкция. Т.е. указанный запрос будет выполняться заново каждый раз, когда запрашивается его информация. С другой стороны, используемые таблицы достаточно компактны и почти стопроцентно кэшированы, так что вряд ли это может заметно сказаться на производительности.

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

    Актуализация данных таблицы (точнее, её полный пересчёт) выполняется из триггерной процедуры на каждое событие изменения любой из используемых в запросе таблиц, если изменение связано с вашей системой (заодно можно выпилить оттуда не связанные с приложением записи). Поскольку работа по изменению указанных данных достаточно редкая по сравнению с запросами на получение данных, такая схема может дать определённый профит. Однако, поскольку процесс предусматривает полную очистку таблицы и заполнение её с нуля, следует избегать интерференции со стороны двух конкурентных процессов изменения. Для полной гарантии любые изменения следует проводить в изолирующей транзакции.

    Хотя как по мне, следует отделить систему безопасности Постгресса от авторизации в приложении. Мнение по данному вопросу от Everything_is_bad в комментарии - это не сарказм, а весьма правильное замечание.
    Ответ написан
    Комментировать
  • Лимит на количество L2-vlan на L3 коммутаторе brocade?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Документация на странице 7 утверждает, что девайс поддерживает полный набор виланов, все 4096 штук.
    Ответ написан
    Комментировать
  • Как исправить ошибку связанную с FULL JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MySQL в принципе не знает о существовании FULL JOIN. И это как раз тот редчайший случай, когда сообщение об ошибке не соответствует проблеме.

    Проблема решается эмуляцией. Есть как минимум два варианта:

    SELECT * FROM table1 LEFT JOIN table2 USING (column)
    UNOIN ALL
    SELECT * FROM table1 RIGHT JOIN table2 USING (column) WHERE table1.column IS NULL

    SELECT *
    FROM (
        SELECT DISTINCT column FROM table1
        UNION ALL
        SELECT DISTINCT column FROM table2
        ) AS table0
    LEFT JOIN table1 USING (column)
    LEFT JOIN table2 USING (column)

    Во втором варианте кажется, что DICTINCT не нужны - но с ними работать будет заметно быстрее, особенно если поле индексировано.
    Ответ написан
    2 комментария
  • Как из word перенести таблицу в Excel с сохранением стилей и форматом?

    @Akina
    Сетевой и системный админ, SQL-программист.
    чтобы ничего не двигать не редактировать

    Нет, нельзя. Ширина колонки и высота строки - это именно атрибут колонки/строки. А не прямоугольного диапазона ячеек, в который выполнится вставка. Так что двигать - придётся.

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

    PS. Можно эту таблицу вставлять не как значения ячеек, а как объект Документ MS Word. Вот тогда точно ничего не уплывёт.
    Ответ написан
    4 комментария