Задать вопрос
  • Какая разница между типами vlan?

    @Akina
    Сетевой и системный админ, SQL-программист.
    802.1Q VLAN
    Базовый, объемлющий, протокол.
    К пакету при отправке добавляется информация (дополнительный заголовок) с номером VLAN. Такой пакет называется/является маркированным номером VLAN (тегованным). Соответственно при приёме номер VLAN сверяется с разрешённым, при несовпадении пакет отбрасывается. Мест добавления/контроля, как и способов, существует несколько.

    Port-Based VLAN
    Разновидность протокола, при котором номер VLAN жёстко связан с физическим портом устройства. Входящий нетегованный пакет маркируется именно тем номером, который зарегистрирован на порте, входящий/исходящий тегованный пакет проверяется на то, что номер соответствует зарегистрированному на порте, иначе пакет отбрасывается. К порту может быть привязано несколько номеров как разрешённые входящие/исходящие для тегованного трафика, но строго один для нетегованного трафика. Исключение - вторым может быть Voice VLAN, но эту ситуацию обслуживает отдельный протокол-надстройка (к тому же он всегда MAC-based).

    802.1Q Management VLAN
    Номер VLAN, к которому привязан IP-адрес внутреннего интерфейса управления. Из другого VLAN интерфейс по этому адресу недоступен. Внутренний интерфейс может иметь несколько адресов из разных непересекающихся подсетей, тогда каждый будет привязан к своему Management VLAN.
    Ответ написан
    1 комментарий
  • Как объединить 2 запроса в 1 в Postgresql или как изменить запрос ниже?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Чисто технически, без понимания сути происходящего:
    WITH cte AS (
        SELECT PIP.purchase_id, SUM(PIP.product_count * PR.new_price) AS all_sum
        FROM product_in_purchase AS PIP
        RIGHT OUTER JOIN price_register AS PR ON PIP.product_id = PR.product_id
        GROUP BY PIP.purchase_id
    )
    ( SELECT * FROM cte ORDER BY all_sum ASC LIMIT 1 )
    UNION 
    ( SELECT * FROM cte ORDER BY all_sum DESC LIMIT 1 )
    Ответ написан
    4 комментария
  • Есть вариант сохранить в поле json (mysql) массив с нужным порядком?

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

    Согласно описанию формата, порядок элементов внутри объекта не существует (вернее, не определён), и его поддержание не гарантируется. В отличие от массива.
    Так что если порядок важен, то каждая запись должна быть преобразована в отдельный объект, а все они - сложены в массив в нужном порядке, т.е. JSON должен выглядеть, например, так:
    '[{"a":1}, {"b":2}, {"c":3}]'

    Я его превращаю в json (json_encode), и кладу в бд.

    Покажите точно, как выглядит этот JSON.
    Покажите точный CREATE TABLE таблицы, в которую кладёте.
    Покажите, как точно выглядит в таблице положенное туда JSON значение.
    Покажите точно это же JSON значение после обратного извлечения.

    Да, всё это - для одного и того же JSON.
    Ответ написан
    Комментировать
  • В каких случаях используются ip-сети?

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

    Более осмысленного ответа на заданный вопрос дать невозможно.

    Ни общность кабельной сети, ни территориальность при этом не имеют абсолютно никакого значения.
    Ответ написан
    Комментировать
  • Как добавить в пустой столбец таблицы сумму из другой таблицы по заданному условию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Подскажите пожалуйста, какую функцию необходимо написать, чтобы в column_3 подсчитывалась сумма из column_2 учитывая группировку с column_1?

    Прежде чем спрашивать "как", обоснуйте, зачем это делать.

    Хранение агрегированной суммы в таблице - это называется "переопределённые данные". Что (1) практически никогда не нужно (2) зачастую просто вредно. Правильно - считать требуемое значение из исходных данных в тот момент, когда оно реально нужно.

    Хранение переопределённых данных - это просто хранение лишнего. Но это не единственная опасность. Любая нештатная ситуация - и значение запросто может не обновиться, либо неверно обновиться. Итогом станет хранение в таблице неправильных значений. И что самое противное - эта неправильность ну никак не детектируется. Пока наконец использование неверного значения не аукнется где-то в другом месте, с фейерверком и воплями, а то и с увольнением программиста, допустившего такой архитектурный косяк.
    Ответ написан
    Комментировать
  • Где может быть ошибка в SQL запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Причина очень проста. Формально comma-style join - это алиас CROSS JOIN. Но есть подвох - приоритет comma-style join ниже приоритета explicit join. И выражение источника данных, если расставить скобки в соответствии с приоритетом, получится такое:

    from
    table1 , ( table2
               left join table1 h on table1.id = h.id
               left join table2 s on table2.id = s.id )

    Вот теперь прекрасно видно, что внутри скобки о существовании где-то там снаружи table1 ничего не известно.

    Правильно - забыть НАВСЕГДА о возможности использовать запятую. И писать вот так:
    FROM table1 
    CROSS JOIN table2
    LEFT JOIN table1 h ON table1.id = h.id
    LEFT JOIN table2 s ON table2.id = s.id


    PS. Если всё же без comma-style жизнь не мила, можно поступить так, как обычно делают для явного задания приоритета. То есть добавить задающие приоритет скобки:
    FROM (table1 , table2)
    LEFT JOIN table1 h ON table1.id = h.id
    LEFT JOIN table2 s ON table2.id = s.id

    Теперь всё в порядке - сначала выполнится запятая, а потом к результату будут LEFT JOIN остальные две таблицы.
    Ответ написан
    1 комментарий
  • Как заменить строку на цифры у оператора IN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если передаваемый параметр - это CSV идентификаторов, то следует использовать
    SELECT *
    FROM `users`
    WHERE FIND_IN_SET(id, ?);


    Примечание 1. CSV не должен содержать никаких паразитных пробелов (а то любят всякие "украшатели" понатыкать пробелов после запятой).
    Примечание 2. Такой запрос - гарантированный фуллскан. Зато не будет инъекции.

    PS. В принципе этот CSV несложно довести до состояния JSON array (всего-то две скобки добавить) - тогда можно применить JSON_CONTAINS(), что может быть немного быстрее. А уж если переданный JSON распарсить на отдельные значения с помощью JSON_TABLE(), так ещё и от фуллскана избавимся (правда, версия сервера нужна достаточно свежая).
    Ответ написан
    2 комментария
  • Почему выдает ошибку 1442?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE DEFINER=root@localhost
    TRIGGER bi_trigger_in_employees
    BEFORE INSERT ON employees 
    FOR EACH ROW 
    SET NEW.entpr_name = COALESCE( NEW.entpr_name, 
                                   ( SELECT ap_name 
                                     FROM companies 
                                     WHERE id = NEW.entpr_id 
                                     LIMIT 1
                                    )
                                  ),
        NEW.employee_name = COALESCE( NEW.employee_name, 
                                      ( SELECT CONCAT_WS(' ',np_surname,np_name,np_patronymic) 
                                        FROM people 
                                        WHERE id = NEW.employee_id
                                        LIMIT 1
                                       )
                                     );

    1) Суть ошибки - именно та, что написана в сообщении. Нельзя UPDATE таблицы, на которой определён триггер (и другие DML - тоже нельзя).
    2) Изменять вставляемые значения надо до вставки, а не после. Потому BEFORE триггер.
    3) По-хорошему, нужен ещё аналогичный BEFORE UPDATE триггер.
    4) Все SET выполняются в одном операторе (см. https://dev.mysql.com/doc/refman/8.0/en/set-variab...). А триггер из одного оператора обходится и без BEGIN-END, и без DELIMITER.
    5) При скалярном присвоении из подзапроса ВСЕГДА добавляйте LIMIT 1. А по-хорошему ещё и ORDER BY. На показанный код ни то, ни другое не влияет - всё равно одна запись, ибо отбор по PK. Но вдруг структура поменяется, а про триггер забудете? Начнутся ошибки - оно надо?

    тогда да, ошибка на бесконечный цикл. Но тут почему?

    Как это ни странно, но в теле триггера неизвестно, на какое событие определён триггер.
    Ответ написан
    1 комментарий
  • Как посчитать сумму по двум столбцам в таблице, за прошлую неделю от текущей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT *, DENSE_RANK() OVER (ORDER BY period DESC) drnk
        FROM source_table
    )
    SELECT period,
           SUM(some_value) AS 'Количество order_cost', 
           SUM(just_value) AS 'Количество доставок', 
    FROM cte
    WHERE drnk = 2
    GROUP BY 1;
    Ответ написан
    Комментировать
  • Почему подсеть перестает видеть при включении прокси?

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

    Не надо слушать каждого начальствующего придурка. Его дело - поставить задачу и заткнуться. А вот как её решать и что для этого решения делать - должен решать ты. Подключив к процессу голову.

    Единственное место, где надо указывать настройки для новой схемы доступа - это сервер, который маршрутизирует клиентов в Инет, т.е. тот, на котором выполняется задача ИКС.

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

    Почему подсеть перестает видеть при включении прокси?

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

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

    1. Выполнить опрос системы на предмет неиспользуемых портов в диапазоне пользовательских (49152—65535, кроме зарезервированных) портов. Выбрать из них необходимое количество портов и захватить их.
    2. Сформировать некий сервис (например, HTTP-сервер) на некоем незарезервированном статически назначенном порте из диапазона назначаемых программных портов (4096-49151), к которому клиент может обратиться и получить список захваченных для работы сервиса портов.
    Ответ написан
    Комментировать
  • Как c помощью bat-файла открыть все ссылки в браузере из одной папки на рабочем столе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Что-то типа такого:
    FOR %%x IN ("x:\folder\*.url") do browser.exe %%x
    Ответ написан
    Комментировать
  • Как разбить одну таблицу на две и правильно заполнить её данными из импорта?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TABLE client ( clientid INT AUTO_INCREMENT PRIMARY KEY,
                          firstname VARCHAR(255),
                          lastname VARCHAR(255),
                          phone BIGINT,                           -- если исходный VARCHAR - поменять, 
                                                                  -- либо соотв. преобразование в INSERT
                          UNIQUE (firstname, lastname, phone) );  -- можно потом удалить
    
    INSERT INTO client (firstname, lastname, phone)
        SELECT DISTINCT firstname, lastname, phone
        FROM orders_old;
    
    CREATE TABLE order ( orderid INT AUTO_INCREMENT PRIMARY KEY,
                         ordernumber INT,
                         clientid INT,
                         FOREIGN KEY (clientid) REFERENCES client (clientid) );
    
    INSERT INTO order (ordernumber, clientid)
        SELECT orders_old.ordernumber, client.clientid
        FROM orders_old
        JOIN client USING (firstname, lastname, phone);

    NOT NULL - по вкусу.
    Ответ написан
    1 комментарий
  • Как в PosgreSQL, в JSON добавить key:value?

    @Akina
    Сетевой и системный админ, SQL-программист.
    https://www.postgresql.org/docs/current/functions-...

    Оператор конкатенации JSONB - ||

    В более сложных случаях - jsonb_set(), jsonb_insert()... в общем, посмотри сам.
    Ответ написан
    Комментировать
  • Что конкретно делает wi-fi wi-fi'ем?

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

    Соответствие стандарту.
    В первую очередь, наверное, такие характеристики как набор рабочих частот и протокол канального уровня.
    Ответ написан
    Комментировать
  • Как правильно конвертировать SQL дату, чтобы корректно принять и отправить?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Хранить следует в формате для хранения даты (с учётом необходимости дополнительного хранения информации о зоне времени). Если СУБД имеет встроенный тип DATE - следует использовать его. Если такого нет - DATETIME. Если и такого нет - TIMESTAMP.

    Вводить следует в том формате, в каком согласно документации следует представлять литералы даты.
    Ответ написан
    Комментировать
  • Как задать поиск по совпадения в 2 и более слов?

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

    Нет. Вернее, этого недостаточно.
    Условие WHERE name LIKE '%сок%перс%', конечно, не пропустит указанные нежелательные записи - но и "Персиковый сок" тоже будет отброшен.

    Нужно проверять наличие каждого слова отдельно.

    SELECT *
    FROM table
    WHERE name LIKE '%сок%'
      AND name LIKE '%перс%';
    Ответ написан
    Комментировать
  • Как получить сумму стоимости товаров из массива json?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT test.id, SUM(jsontable.price) total_price
    FROM test
    CROSS JOIN JSON_TABLE(test.data,
                          '$.products[*]' COLUMNS (price INT PATH '$.price')) jsontable
    GROUP BY test.id

    fiddle
    Ответ написан
    Комментировать
  • Как выбрать нужные позиции в базе по датам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM tablename
    WHERE data < CURRENT_DATE + INTERVAL 5 DAY
    -- AND data >= CURRENT_DATE
    Ответ написан
    Комментировать
  • Как добавить данные для каждого массива в трехмерным массиве PHP?

    @Akina
    Сетевой и системный админ, SQL-программист.
    $db->prepare("SELECT comments.id, ... , users.login
                       , :me AS me 
                  FROM `comments` ... ");
        $comments->execute([
        "id_post" => $dataAttr,
        "me" => $_SESSION["user"]["id_user"],
        ]);

    или типа того...
    Ответ написан
    1 комментарий