Задать вопрос
  • Как составить аналогичный запрос, если поле text, а не json?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Можно ли написать такой же запрос, если поле raw не jsonb, а text?

    Ну офигеть проблема - заменить tp."raw"->>'errorCode' на tp."raw"::JSONB->>'errorCode'

    Кстати, это применимо к полю обоих типов. Просто для JSON - избыточно.
    Ответ написан
    1 комментарий
  • Это нормальные результаты трассировки?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Трассировка - это ICMP. Обработка ICMP, или во всяком случае обработка ping и отправка pong - это задача с низшим приоритетом для любого узла за редчайшим исключением. Потому даже 100% потерь ни о чём не говорят. TCP или UDP пинг был бы более информативен, но с ними есть определённые сложности - при отсутствии специального ПО на целевом узле результаты будут весьма приблизительными.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Диапазон от 194.58.80.0/24 до 194.58.95.0/24 - лучше. Он извне (на внешнем интерфейсе) накрывается одним маршрутом.

    194.58.80.0 .. 194.58.95.0 = 194.58.80.0/20
    194.58.72.0 .. 194.58.87.0 = 194.58.72.0/21 + 194.58.80.0/21

    Впрочем, лучше - провайдеру. Потребителю - глубоко пофиг.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS ( SELECT *, 
                         LAG(`datetime`) OVER (PARTITION BY login ORDER BY `datetime`) lag_datetime, 
                         LAG(event) OVER (PARTITION BY login ORDER BY `datetime`) lag_event 
                  FROM history )
    SELECT login, SUM(TIMESTAMPDIFF(MINUTE, lag_datetime, `datetime`)) duration
    FROM cte
    WHERE (event, lag_event) = (2,1)
    GROUP BY login;

    https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=398... (исходные данные подправлены).
    Ответ написан
    1 комментарий
  • Бывает ли дружба между двумя сетями на 1 ПК?

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

    Однако, судя описанию, обе сетевые карты настроены на автоматическое получение адреса. И соответствующие DHCP-серверы не рвутся правильно анонсировать маршруты, а просто анонсируют шлюз по умолчанию.

    Соответственно для нормальной работы нужно (при условии, что обе карты адресуются по DHCP):

    1. Настроить метрики интерфейсов, поставить интерфейсу в корпоративной сети более высокую метрику (бОльшее значение метрики соответствует более низкому приоритету интерфейса, и соответственно его маршрутов).

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

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

    Впрочем, это всё будет работать только в случае, если в корп. сети не производятся какие-то перестройки (изменения адресации). Если что-то изменится, скорее всего придётся корректировать и свои локальные настройки.
    Ответ написан
    1 комментарий
  • Как использовать maxmind GeoLite2 на mysql 5.5, где нет inet6_aton?

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

    Не вижу проблемы. Импорт не использует inet6_aton. Соответственно после импорта можно просто удалить записи с IPv6-адресами. А затем ещё и изменить тип поля на VARBINARY(4).
    Ответ написан
  • Как создать свою двойную шапку заголовков в запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT {выходные поля запроса}
    FROM ( SELECT 3 AS rownumber, {выходные поля запроса}
           FROM {остальное тело запроса} )
         UNION ALL
         ( SELECT 1, {надписи шапки}
           FROM DUAL )
         UNION ALL
         ( SELECT 2, {кастомные названия}
           FROM DUAL )
    ) AS total
    ORDER BY rownumber, {остальные поля сортировки};
    Ответ написан
  • Как группировать данные, если у них есть уникальные id?

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

    Вот есть некая группа, в ней все off_id одинаковы, но id различны. После группировки все эти записи будут сгруппированы в одну. А теперь, внимание, вопрос: ну и какое одно значение id из всех возможных сервер должен вернуть? не знаете? так ведь и сервер не знает... вот он и генерирует ошибку.

    Уберите id из выходного набора. Либо явно и чётко скажите серверу, какое именно значение из всех возможных в группе он должен вернуть. Наименьшее? требуйте MIN(id). Наибольшее? MAX(id). Хоть какое, любое? ANY_VALUE(id).
    Ответ написан
    Комментировать
  • Как организовать сеть (теория)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    • 0. Всегда (на все три вопроса). 800 устройств в одном домене коллизий, это [censored] и полный ступор.
    • 1. Да. Но нет. Все в одной подсети - бред и никакого смысла.
    • 2. Немаршрутизируемые в Интернет адреса (bogon networks). Я бы делал подсети в 172.16. Но это дело вкуса.
    • 3. Ни разницы, ни усложнения нет и в помине. Стандартности тут тоже никакой.
    • 4. Каждую подсеть в свой VLAN. Ибо нефиг.
    • 5. Серверы в отдельных подсетях. Причём не одной. Что делать серверу видеонаблюдения в подсети бухгалтерии?
    • 6. Стройте схему на основании потоков трафика, а не по некоему мистическому наитию.
    • 7. Не у телефонии, а у некоторых коммутаторов есть специальная работа с VoiceVLAN. да, только экономия портов. Если не работал - то и не связывайся. Потом поэкспериментируешь.
    • 8. По требованиям безопасности сеть видеонаблюдения вообще должна быть по возможности физически отделена от пользовательской. Отдельные коммутаторы и кабельные линии. да и трафика они генерят - могут забивать каналы, оно надо? То же и с линиями охранно-пожарной сигнализации - но тут строго, никаких "по возможности".
    • 9. Сервер печати. И да - он и принтеры в отдельном VLAN.

    Ставим L3 коммутатор, который будет рулить потоком, его же добавляем в качестве шлюза.

    Ставь сразу нормальный маршрутизатор.
    Потому что коммутатор, хоть и L3, тебе ничего не даст во вменяемой форме - ни статистики, ни управления, ни наблюдения.
    Ответ написан
    13 комментариев
  • Как добавить свойство в каждый элемент массива в postgresql /jsonb при помощи sql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT 'Bob' AS name, 25 AS age UNION ALL
        SELECT 'Mark'       , 30        UNION ALL
        SELECT 'Joe'        , 35
    )
    SELECT test.id,
           jsonb_build_object('items', jsonb_agg(jae.value_1 || jsonb_build_object('age', cte.age)))
    FROM test
    CROSS JOIN jsonb_array_elements(test.value->'items') AS jae (value_1)
    LEFT JOIN cte ON cte.name = jae.value_1->>'name'
    GROUP BY test.id

    DEMO
    Ответ написан
    2 комментария
  • Что провайдер сделает за ддос на меня?

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

    и кто-нибудь решит задудосить

    Ты сперва спроси себя и честно себе же ответь - вот ты правда кому-то нахрен нужен настолько, чтобы тебя ДДоСить? Особенно с учётом того, что действительно реальный ДДоС, а не детские игры в песочнице - занятие в общем-то недешёвое.

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

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

    Постоянная и динамическая коммутация

    Как сети с коммутацией пакетов, так и сети с коммутацией каналов можно разделить на два класса:

    • сети с динамической коммутацией ;
    • сети с постоянной коммутацией.


    В сетях с динамической коммутацией:

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

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

    Сеть, работающая в режиме постоянной коммутации:

    • разрешает паре пользователей заказать соединение на длительный период времени;
    • соединение устанавливается не пользователями, а персоналом, обслуживающим сеть;
    • период, на который устанавливается постоянная коммутация, составляет обычно несколько месяцев;
    • режим постоянной ( permanent ) коммутации в сетях с коммутацией каналов часто называется сервисом выделенных ( dedicated ) или арендуемых ( leased ) каналов;
    • в том случае, когда постоянное соединение через сеть коммутаторов устанавливается с помощью автоматических процедур, инициированных обслуживающим персоналом, его часто называют полупостоянным (semi-permanent) соединением, в отличие от режима ручного конфигурирования каждого коммутатора.
    Ответ написан
    Комментировать
  • Как распарсить строку?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS ( SELECT name, last_name, cnt FROM table
                  UNION ALL
                  SELECT name, last_name, cnt - 1 FROM cte WHERE cnt > 1 )
    SELECT name, last_name FROM cte;
    Ответ написан
    Комментировать
  • Нужно добавить текст к уже имеющемуся в ячейках Excel. Какую формулу использовать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Никакую.
    Формула не может изменить другую ячейку. Формула не может именно изменить себя - только посчитать новое значение.
    Это делается либо формулой в отдельном столбце с последующей заменой исходного столбца на рассчитанные значения, либо процедурой на VBA.
    Ответ написан
    1 комментарий
  • Как выполнить SELECT с таким условием?

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


    SELECT *
    FROM services
    JOIN (
        SELECT *,
               @row_number := CASE WHEN service_id = @service_id
                                   THEN @row_number + 1
                                   ELSE 1
                                   END rownumber,
               @service_id := service_id
        FROM orders
        CROSS JOIN (SELECT @service_id := 0, @row_number := 0) init_vars
        ORDER BY service_id, id DESC
        ) enumerated_orders USING (service_id)
    WHERE enumerated_orders.rownumber <= services.service_limit

    https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=1f2a95...
    Ответ написан
    1 комментарий
  • Как изменять значение в бд по времени?

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

    В комплекте с информацией о факте оплаты должна существовать и информация о дате-времени открытия доступа по подписке. Кстати, в этом случае сама информация о факте оплаты не нужна, достаточно просто самого факта наличия момента оплаты либо срока действия оплаченного доступа.

    значение сменилось на 1, а потом через месяц само сменилось на 0.

    Для этого у MySQL есть свой встроенный планировщик. Запускаем, создаём процедуру, которая выполняется, например, ежеминутно, и обнуляет поле доступа для всех записей, у которых разница между текущим штампом времени и штампом времени открытия доступа превышает срок доступа (хардкод, либо взятый из служебной таблицы или даже из обрабатываемой записи).

    MySQL 8.0 Reference Manual / Stored Objects / Usin...
    Ответ написан
    Комментировать
  • Как ограничить количество через join?

    @Akina
    Сетевой и системный админ, SQL-программист.
    хотелось бы посмотреть на версию mysql 5.7


    Ну например так:
    SELECT department.name as department_name, 
           employee.name
    FROM employee 
    JOIN department ON employee.department_id = department.id 
    WHERE 2 > ( SELECT COUNT(*)
                FROM employee emp
                WHERE emp.department_id = employee.department_id
                  AND emp.id < employee.id )

    Ну или так:
    SELECT department.name as department_name, 
           subquery.name
    FROM department
    JOIN ( SELECT employee.*,
                  @row_number := CASE WHEN @department = department_id
                                      THEN @row_number + 1
                                      ELSE 1
                                      END rownumber,
                  @department := department_id
           FROM employee
           CROSS JOIN ( SELECT @department:=0, @row_number:=0 ) variables
           ORDER BY department_id, id ) subquery ON subquery.department_id = department.id
    WHERE subquery.rownumber <= 2


    fiddle
    Ответ написан
    Комментировать
  • Задача пустых полок?

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

    Не поверишь...

    Достаточно просто чётко фиксировать количество товара, выставленное на полки либо снятое с них. Тогда количество товара на полках на основании этих сведений и сведений из кассовых чеков можно ПОСЧИТАТЬ! Ну плюс-минус на разбитое, утащенное в соседнюю секцию и брошенное куда попало, оставленное на кассе по причине, скажем, нехватки денег, украденное и т.п. Всего-то и делов, что вздрючить мерчендайзеров и наладить нормально учёт.

    А ты тут с вероятностями дурью маешься.
    Ответ написан
    Комментировать
  • База данных MySql, как сделать переменную, с индивидуальным значением для всех аккаунтов?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну вообще-то под такие цели обычно создаётся специальная служебная таблица.
    Ответ написан
    2 комментария
  • Как в select добавить нумерацию результатов?

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

    Обломись.

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

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