Задать вопрос
  • Как группировать данные, если у них есть уникальные 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, который бы шел по порядку с той таблицы которая у меня уже есть.

    Обломись.

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

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

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

    1. В ячейку B1 вставить формулу =A2. В ячейку С1 вставить формулу =A3. И так далее до E1=A5.
    2. Выделить ячейки B1-E1.
    3. Выполнить двойной щелчок по маленькому кубику в нижнем правом углу выделения. Записи размножатся вниз.
    4. Не сбрасывая выделения, нажать "Копировать".
    5. Не сбрасывая выделения, нажать "Специальная вставка - значения".
    6. Выделить столбец A. Выполнить Сортировка от А до Я. Согласиться на авторасширение диапазона.
    7. Выделить и удалить все строки, которые НЕ начинаются с даты.

    Всё.

    Если надо делать регулярно - записать макрос. Строки для удаления тогда найти поиском (например, по слову "Продажа").
    Ответ написан
  • Какая разница между типами 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 комментарий