• Нужна формула: узнать для приобретения скольких товаров хватит имеющейся суммы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Вот не вижу проблем.
    1. Есть количество товаров, приобретённых юзером. То есть, грубо говоря, известно, что пропустить и откуда считать.
    2. Если надо набрать указанную сумму, то по имеющимся товарам нужна сумма с накоплением. А чтобы не учитывать уже купленное - домножать на признак "ещё не куплено", являющийся результатом сравнения текущего номера товара и количества приобретённых товаров.
    3. Отдельно вспомним, что стоимость - штука сугубо положительная. А после домножения на признак - неотрицательная. И, значит, сумма с накоплением строго неубывающая на начальных нулях, а дальше так и вообще строго возрастающая. Иными словами - сортированная.
    4. Осталось вовремя остановиться. Но именно так работает ВПР()/ГПР() на сортированном списке при поиске ближайшего/неточного значения.
    Ответ написан
    5 комментариев
  • Как настроить mikrotik с коммутатором Cisco?

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

    Ему вообще-то похрен.
    А циска пусть работает как тупой свитч. То есть абсолютно всё, кроме коммутирования - нахрен.

    я докупил Cisco Catalyst WS-C2960-24TC-L

    Можно было обойтись любым неуправляемым коммутатором на нужное число портов.
    Ответ написан
    Комментировать
  • Есть ли программа, которая при отправке запроса проверяет через какие маршрутизаторы и роутеры проходит запрос?

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

    В общем случае получение полного маршрута - вообще без шансов.

    Дело в том, что любой маршрутизатор в принципе-то может делать с маршрутизируемым пакетом что угодно. В том числе он запросто может и спрятаться - он просто увеличит TTL на единичку (точнее, не станет его уменьшать) и отправит дальше. Такой маршрутизатор мы в трассе просто не увидим, равно как и не увидим в этой трассе никаких иных ненормальностей.

    на работе в серверной куча лапши из проводов и свичей

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

    Я, когда пришёл на свою нынешнюю работу, угрохал на такое разбирательство почти два месяца.
    Ответ написан
    Комментировать
  • Объясните CASE WHEN THEN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    ...
    SET view = CASE ad_id WHEN 34 THEN 0
                          WHEN 35 THEN 1 
                          WHEN 36 THEN 2
                          END,
        amount = CASE WHEN ad_id = 36 
                      THEN 466
                      ELSE amount
                      END
    WHERE ad_id  IN (34, 35, 36);
    Ответ написан
    3 комментария
  • Как динамически делать выборку по дням, неделям или месяцам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как вы видите, тут идёт выборка за 2 дня: 2024-04-09 и 2024-04-10. Но проблема в том, что количество дней указывает пользователь и их может быть сколько угодно. Подскажите, как правильно сделать, что если пользователь указал, например, 10 дней, то выборку сделать за 10 дней (начиная от сегодня)?

    Я вижу, что количество выходных полей зависит от внешних условий. То есть структура выходного набора динамическая, а всё вместе это по сути сводная таблица. То есть штука совсем даже не реляционная.
    Да, некоторые СУБД имеют встроенные средства для формирования PIVOT TABLE. Yо вот у MariaDB с этим не очень.

    Рекомендую - на стороне СУБД получать нормализованный набор записей (country_id, ts, MAX(hangup_rate), MAX(all_answered)), а сводную строить уже на клиенте.
    Ответ написан
    Комментировать
  • Есть ли в excel формула вставки строк?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Функция, встроенная или определённая пользователем, при использовании в формуле ячейки НЕ МОЖЕТ ИЗМЕНЯТЬ ЗНАЧЕНИЯ ЯЧЕЕК. В принципе не может. А любая такая попытка в определённой пользователем функции немедленно приводит к ошибке и аварийному завершению работы функции.
    Ответ написан
    Комментировать
  • Как показать 'соседние' записи?

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

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn
        FROM tablename
        WHERE type = @type
        )
    SELECT /* DISTINCT */ t2.*
    FROM cte t1
    JOIN cte t2 ON t2.rn IN (t1.rn - 1, t1.rn, t1.rn + 1)
    WHERE t1.status = @status
    ORDER BY t2.rn
    Ответ написан
    Комментировать
  • Как получить доступ у серверу извне?

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

    (source IP1) - (IP2 router1 IP3) - (IP4 router2 IP5) - ... - (IPn destination)

    У тебя весь маршрут точно известен. А потому временно добавляем на источнике (IP1) маршруты во все промежуточные подсети, если они не покрываются маршрутом по умолчанию или более широкими частными маршрутами, и с источника (IP1) начинаем последовательно пинговать IP2, IP3, IP4, .. и так до узла назначения.

    Где-то возникнет проблема, и очередной IP не ответит. Вот именно знание, кто не ответил, и какой именно тип ошибки пинга возвращён, и позволит определить, на каком узле и по какой причине грабли. Конечно, следует понимать, что в маршруте может быть несколько последовательных ошибок, и даже несколько параллельных на одном узле.

    Например, если проходит пинг на IP4, но не проходит на IP5, то в случае ответа No route to host проблема - в отсутствии маршрута в подсеть IP5 на узлах source (забыли добавить или сделали это неправильно) или router1, а в случае ответа Timeout проблемы с маршрутизацией на узле router2 или файрволом на любом из трёх задействованных в маршруте узлов.
    Ответ написан
    Комментировать
  • Как вставить данные сразу в 2 объединенные таблицы?

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

    Бред сивой кобылы (извиняюсь). Структура (точные имена полей, и в какой таблице какое поле) обязана быть заранее известна. Даже если используется псевдодинамическая структура на базе EAV или иным способом организованная.

    у меня есть 2 таблицы или допустим будет 3 ... Я хочу при выполнении insert into или update использовать эти таблицы

    MySQL не реализует одновременную вставку в более чем одну таблицу. А также не реализует использование запроса на вставку в CTE. Напрямую задача не решается.

    Правильная реализация - создание хранимой процедуры, которая принимает значения для всех параметров, и выполняет вставку нужных значений в таблицы последовательно выполняемыми запросами, при необходимости получая значения автоинкрементных полей из предыдущей вставки.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Рабочий ли вариант если просто через rsync передать всю папку /var/lib/mysql?

    Просто перенос файлов рабочей БД окончится тем, что файлы есть, а базы нет, потому что неоткуда взяться метаданным в системной базе данных. Вернее, всё ещё забавнее - базы вроде бы и нет (USE приводит к ошибке "БД не существует"), но её нельзя создать, потому что она есть. И то же самое с таблицами (SELECT/DROP/прочее нельзя, потому что таблицы нет, CREATE нельзя, потому что она есть).

    Метод сработает, если переносить все БД сразу, включая служебные. Но требуется точное соответствие исходной и конечной конфигураций - начиная с версии и сборки MySQL и кончая именами каталогов и именами/паролями учётных записей в операционной системе. Плюс перегенерация и переподключение сертификатов.

    Еще вариант с репликацией, но насколько я понял всё равно базу нужно блокировать на момент дампа, а это тоже какое-то время

    Решений без блокирования практически не существует. Нет, можно наколхозить реальное решение, которое обойдётся вообще без остановки, я даже представляю как именно (FEDERATED ENGINE + triggers), но подробно рассказывать не буду - для её реализации нужны достаточная квалификация и опыт, на одних советах шанс на удачу невелик, скорее всё поломается.

    Есть вполне себе документированные способы: Copying MySQL Databases to Another Machine. Особенно последний из описанных. Он предполагает минимальное время простоя при использовании штатных средств.
    Ответ написан
    Комментировать
  • Можно ли по мак адресу присвоить Vlan ID Cisco?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Существуют port-based VLAN и MAC-based VLAN.
    Первый - это когда определённый VLAN назначается порту коммутатора статически.
    Второй - это когда VLAN назначается порту в зависимости от MAC-адреса подключенного к порту оборудования.
    Оба варианта работают, само собой, только с нетегованными пакетами, то есть на чисто клиентских либо гибридных портах, но не на транковых.

    Вроде бы второй вариант - именно то, что нужно. Но есть подвох. Всё зависит от того, как именно реализован протокол на конкретном устройстве. Потому как возможны два варианта.

    Первый - это когда пакет от хоста направляется в VLAN в зависимости от MAC узла-источника. В этом случае получится именно то, что нужно.

    Второй вариант (достаточно старый, по-моему, сейчас нигде не реализуется) - это когда порт коммутатора включается в VLAN, определяемый (первым) найденным на данном порте MAC клиента, и в дальнейшем не изменяется. Конечно, этот вариант не подходит. А потому на имеющемся оборудовании просто надо либо проверить на практике, либо почитать в мануале (впрочем, обычно этот момент не описывается), какой из вариантов реализован.

    Есть ещё третий вариант, хотя на самом деле первый. Это Voice VLAN. Эта возможность имеется не на всяком оборудовании, но если имеется, то она однозначно работает по первому варианту. То есть можно тот VLAN, в котором камеры, объявить Voice VLAN, и получить решение задачи.

    -------------------------------------

    С другой стороны, если практически вся сеть строится на неуправляемых коммутаторах, какой вообще великий смысл в этом мероприятии? гораздо разумнее сделать нормальный проект сети и заменить всё это неуправляемое г.. на управляемые коммутаторы. Причём необязательно гнуть пальцы и брать именно сиськи - нет смысла переплачивать за шильдик со знаменитым брэндом, лучше за те же деньги купить пару резервных коммутаторов. Заодно описанная проблема сама собой рассосётся.
    Ответ написан
  • Как вывести записи по ближайшей дате сгруппированные по категориям в MySQL 5.7?

    @Akina
    Сетевой и системный админ, SQL-программист.
    На версии 8+ как-то так:
    WITH cte AS (
        SELECT `events`.`id`,
               `events`.`date_public`,
    	   `event_categories`.`id` as `cat_id`,
    	   `event_categories`.`title` as `cat_title`
    	   ROW_NUMBER() OVER (PARTITION BY `event_categories`.`id` ORDER BY `events`.`date_public` ASC) rn
        FROM `events`
        INNER JOIN `event_category_joins` ON `events`.`id` = `event_category_joins`.`event_id` 
        INNER JOIN `event_categories` ON `event_categories`.`id` = `event_category_joins`.`event_category_id` 
        WHERE `events`.`date_public` >= '2024-04-05 19:00:00'
    --    WHERE `events`.`date_public` >= CURRENT_DATE
        )
    SELECT id, date_public, cat_id, cat_title
    FROM cte
    WHERE rn = 1;
    Ответ написан
    1 комментарий
  • Как кучу файлов с дампами таблиц соединить в один?

    @Akina
    Сетевой и системный админ, SQL-программист.
    type X:\sql_files_folder\*.sql | Z:\mysql_bin_folder\mysql -D database_name -u account_name -p

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

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


    Ага... а потом захочется на немецкий, на китайский... так и будешь поля добавлять?

    Классический подход - таблица текстовых литералов

    CREATE TABLE translation (
        token_id INT,      -- идентификатор строки
        language_id INT,   -- идентификатор языка
        PRIMARY KEY (token_id, language_id),
        value VARCHAR(100) NULL DEFAULT NULL
        );


    Соответственно зная номер строки, который нужен, и язык, получаем значение
    SELECT value
    FROM translation
    JOIN language USING (language_id)
    WHERE token_id = @token_id
      AND language_name = @language_name;

    Впрочем, обычное состояние - это когда не все строки переведены. Тогда используется
    SELECT COALESCE((
        SELECT value
        FROM translation
        JOIN language USING (language_id)
        WHERE token_id = @token_id
          AND language_name = @language_name;
        ), (
        SELECT value
        FROM translation
        JOIN language USING (language_id)
        WHERE token_id = @token_id
          AND language_name = @default_language_name;
        )) value;

    То есть для литералов. имеющих перевод, возвращаются именно они, а для ещё не имеющих - значение на языке по умолчанию.

    ============

    С другой стороны, вывод сообщений на экран - это интерактивное взаимодействие, где начхать на производительность. А коли так, то сообщения можно хранить в одном поле в виде JSON объекта, типа
    {
        "ru":"Выход",
        "en":"Quit"
    }

    Но и для такой схемы получение литерала для дефолтного языка при отсутствии перевода - актуально.
    Ответ написан
    Комментировать
  • Как включить/отключить интернет от компьютера удаленно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Подключаешься удалённо к роутеру и disable/enable порта, которому подключен компьютер.
    Если роутер не умеет избирательно отключать порты - то через файрвол включаешь/выключаешь правило, разрешающее доступ из LAN, либо по МАС.
    Ответ написан
    Комментировать
  • Как заблокировать лишний шлюз?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Нужно изменить режим работы Роутера-2. Он должен работать в режиме не роутера, а точки доступа, т.е. просто служить конвертором интерфейса. Ну и, само собой, DHCP на нём отключить.
    Тогда камера будет цепляться за него и через него слать запрос адреса на Роутер-1. Ну вернее слать запрос в проводной интерфейс, а там Роутер-1 единственный DHCP.
    У ТПЛинка на сайте даже видео есть "Как превратить роутер в точку доступа?".
    Ответ написан
    1 комментарий
  • Что такое кластерный индекс в mysql?

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

    Что такое обычный некластерный индекс? берём выражение индекса, считаем его значение для каждой записи, сортируем и пишем на диск. Получаем отдельную структуру, в которой выражение индекса сортировано. Когда потребуется искать заданное значение этого выражения, мы вместо просмотра от записи к записи сразу половинным делением быстренько найдём нужное значение, возьмём из него уникальный идентификатор записи, и обратимся за записью. Если в таблице 1000 записей, то для поиска заданного значения без индекса нам в среднем пришлось бы просмотреть 500 записей, а с индексом - всего 10.

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

    В MySQL (точнее, в используемом по умолчанию движке InnoDB) первичный индекс, во-первых, существует ВСЕГДА, во-вторых, определяется так (в статье, на которую дали ссылку, имеются неточности в пункте 2):
    1. Если первичный ключ задан явно, то его выражение является также и выражением кластерного индекса. Или иначе - первичный ключ и есть кластерный индекс.
    2. Если первичный ключ явно не задан, но в таблице имеется индекс, отвечающий всем следующим требованиям:
      • является уникальным
      • не является функциональным, в т.ч. не использует в выражении вычисляемые поля
      • не использует в выражении поля, которые определены как допускающие значение NULL

      то именно такой индекс используется в качестве первичного. А если таких индексов несколько, то используется первый по тексту запроса на создание таблицы
    3. Если не имеется ни того, ни другого - генерируется синтетический скрытый 6-байтовый номер записи, который и используется как первичный ключ. Следует отметить, что штатных способов доступа к этому значению не существует.


    Выглядит так, как будто это просто физическая сортировка данных по индексируемому полю.

    Фактически - именно так.

    Создаётся ли отдельная таблица или просто упорядочивается хранение существующих данных?

    Не создаётся. Но при изменении первичного индекса таблица полностью пересоздаётся с новым физическим порядком записей.

    Если данные упорядочиваются этим индексом, допустим по ID, то почему при select без сортировки данные могут возвращаться в произвольном порядке, а не отсортированные по ID по-умолчанию?

    Если не задан явно ORDER BY, сервер имеет право вернуть записи в любом порядке, как ему удобнее. В большинстве случаев, но не всегда, он будет возвращать записи в порядке чтения с диска...

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

    ===

    PS. Кстати, правило выбора индекса, который будет использоваться в качестве кластерного, имеет неприятный побочный эффект. Если у некоторых полей, входящих в какие-то индексы, изменяется свойство NULLability, то это может привести к изменению того, какой из имеющихся индексов станет использоваться в качестве первичного по пункту 2. В результате мы получим невозможность использования INSTANT / INPLACE методов, и будет использован длинный COPY. Впрочем, ситуация такая крайне редка.
    Ответ написан
    2 комментария
  • Как разделить сеть на несколько подсетей, чтобы в каждой был определенный вид устройства и настроить для каждой сети получение адреса по dhcp?

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

    Вот вообще не вижу проблемы. Резервирование IP-адреса на DHCP-сервере по МАС-адресу - это единственное, что нужно для решения задачи.

    PS. Правда, три DHCP-скопа, торчащие в одном L2-сегменте - это из разряда "странное"...
    Ответ написан
    Комментировать
  • Как оптимизировать запрос через Sqlalchemy?

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

    SELECT coalesce(A.id, :coalesce_1) AS card_id, 
           coalesce(A.serial_number, :coalesce_2) AS card_number, 
           coalesce(B.name, :coalesce_3) AS prj_name, 
           coalesce(C.name, :coalesce_4) AS client_name, 
           coalesce(A.user_name, :coalesce_5) AS card_owner_name, 
           coalesce(A.user_phone_number, :coalesce_6) AS card_owner_phone_number, 
           coalesce(A.balance_current, :coalesce_7) AS current_balance, 
           coalesce(A.balance_bonus, :coalesce_8) AS bonus_balance, 
           coalesce(A.active, :coalesce_9) AS card_status, 
           coalesce(D.name, :coalesce_10) AS tariff_plan_name, 
           NULL AS anon_1 
    FROM cashless_card 
    JOIN company ON cashless_card.company_id = company.id 
    JOIN voc ON cashless_card.voc_id = voc.id 
    LEFT OUTER JOIN tariff_plan ON cashless_card.tariff_plan = tariff_plan.id 
    WHERE cashless_card.company_id IN (__[POSTCOMPILE_company_id_1])

    Почти очевидно, что в таблицах company, voc и tariff_plan поле по имени id - это первичный ключ... но хотелось бы подтверждения.

    Впрочем, видно, что для оптимизации запроса в таблице cashless_card крайне желательно наличие индекса (company_id). Следует также проверить эффективность индекса (company_id, voc_id, tariff_plan), и аналогичного с переставленными местами последними 2 полями (первым ставить то, которое более селективно).

    Кроме того, эффективность запроса сильно зависит от количества идентификаторов в списке, который передаётся в условие WHERE cashless_card.company_id IN (__[POSTCOMPILE_company_id_1]). Если их более десятка, есть смысл преобразовать этот список в набор данных (синтетическая UNION-таблица) и использовать как ещё один источник данных запроса.

    Ну и надо понимать, что наличие LIMIT/OFFSET только замедляет выполнение запроса. Причём чем больше OFFSET, тем сильнее это замедление.
    Ответ написан
    6 комментариев
  • Как настроить удалённую печать на МФУ Pantum M6550NW без присоединения принтера к сети?

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