Задать вопрос
  • Как правильно сделать запрос с поиском текста?

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    как сформировать запрос чтоб было равенство 2021-10-30 23:59:59 = 10.21

    Если критерий предоставляется именно в такой форме - '10.21',- то
    SELECT * 
    FROM `table` 
    JOIN ( SELECT '10.21' AS parameter) criteria
        ON  `date` >= CONCAT('20', SUBSTRING_INDEX(parameter, '.', -1), '-', SUBSTRING_INDEX(parameter, '.', 1), '-', '01' AS DATE)
        AND `date` < CONCAT('20', SUBSTRING_INDEX(parameter, '.', -1), '-', SUBSTRING_INDEX(parameter, '.', 1), '-', '01' AS DATE) + INTERVAL 1 MONTH

    Условие - SARGable.
    Ответ написан
    Комментировать
  • Как вывести все остальные поля при операции GROUP BY?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score DESC) rn
        FROM source_table
    )
    SELECT *
    FROM cte
    WHERE rn = 1
    -- ORDER BY score DESC LIMIT nnn
    ;
    Ответ написан
    Комментировать
  • Как сконфигурировать сеть так, чтобы сброс роутера не приводил к конфликту в сети?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Провайдер даёт услуги на своём порте. Доступ к Интернету. Телефония.

    А вот дальше потреблять эти услуги и регулировать их потребление ты должен самостоятельно. Так что по уму - оба роутера подключаются к своему роутеру (@Drno правильно предложил), который обеспечивает трансляцию этих сервисов в точки потребления.
    Ответ написан
    Комментировать
  • Какая сложность под капотом у сравнения строка?

    @Akina
    Сетевой и системный админ, SQL-программист.
    o(n) и O(m*n), где m - длина строки.
    Ответ написан
    Комментировать
  • Как в триггере сделать проверку, что изменение вызвал другой триггер?

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

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

    CREATE TRIGGER trigger_name
    EVENT ACTION ON table_name
    FOR EACH ROW
    BEGIN
        SET @trigger_name_table_name = CONCAT('executed, ', 'column_value=', NEW.column);
    -- trigger action
        SET @trigger_name_table_name = NULL;
    END;

    Если в теле триггера определены EXIT хэндлеры - они тоже должны выполнять соответствующие сбросы.
    Ответ написан
    Комментировать
  • Будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

    @Akina
    Сетевой и системный админ, SQL-программист.
    будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

    50/50 - или будет, или нет.

    Однако если он будет использоваться, то не как индекс (сортированный список для выполнения index seek), а как компактная копия таблицы (как несортированный список для выполнения index scan).

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *, 'db1' AS dbasename
    FROM db1.tablename
    WHERE phone = '123-45-67'
    UNION ALL
    SELECT *, 'db2'
    FROM db2.tablename
    WHERE phone = '123-45-67'
    UNION ALL
    ...

    Если список баз не фиксирован и должен формироваться в рантайме - то хранимая процедура с запросом по INFORMATION_SCHEMA.TABLES и динамическим SQL.
    Ответ написан
    Комментировать
  • Как поставить запрет на переименования корзины в Windows 7?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Наименование корзины хранится в HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}.

    Чтобы запретить изменение наименования, нужно изменить разрешения на этот раздел. По умолчанию юзер наследует на него полный доступ. Надо отключить наследование, а затем для юзера сменить его на "Только чтение".

    Побочным эффектом будет утрата возможности изменения иконок пустой/полной корзины. Впрочем, на подраздел с этими ключами (DefaultIcon) можно отдельно дать юзеру полные права. И даже лучше это сделать - иначе попытка смены десктопной темы может свалиться по ошибке (не пробовал).
    Ответ написан
    Комментировать
  • Как правильно выбрать все товары?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT p.name, p.id 
    FROM products AS p
    JOIN product_country AS cp ON cp.product_id = p.id 
    WHERE cp.country_id IN (1,2)
    GROUP BY 1, 2
    HAVING COUNT(DISTINCT cp.country_id) = 2;
    Ответ написан
    Комментировать
  • Как подсчитать бюджет Poe коммутатора?

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

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

    В наличии 6 телефонов по типу d link dph 120se. Максимальное потребление 4вт.

    Учитываем по классу 2, это 7 ватт на порт.

    Две точки доступа Unifi ap ac lite,макс.потреб 6вт.

    Эти по классу 3, т.е. 15.4 ватт на порт.

    Итого нужен бюджет 6*7+2*15,4=73 ватта.
    Ответ написан
    5 комментариев
  • Sequelize, как начать поиск элемента в таблице с конца?

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

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

    как получить id последнего элемента в таблице?

    Последний (при какой-то сортировке) - это первый при обратной сортировке.
    Так что надо просто указать сортировку (обратную той, которую ты считаешь "прямой") и взять только первую запись.
    Ответ написан
    1 комментарий
  • Какой язык программирования учить системному администратору?

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

    Shell scripting - обязательно.
    А также любые другие языки, входящие в штатную поставку обслуживаемых ОС и ПО, включая встроенное ПО оборудования - по возможности и желанию. Но минимальное понимание - обязательно.

    К примеру написать бота в телеграмм, организовать вывод показателей с серверов на сайт, и запилить минимальное приложение для мониторинга под windows/android, не заморачиваясь над фронт-ендом.

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

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

    Смотреть глаза на портах в офисах 1 и 3, подключённых к свичу в офисе 2.

    2. Есть ли L2-линк?

    Смотреть статистику указанных выше портов на предмет входящих-исходящих-ошибочных пакетов.
    Смотреть MAC-таблицу коммутаторов по этим портам.

    3. Настроен ли свич на использование VLAN? Как вообще он настроен?

    Спросить того, кто настраивал коммутатор в офисе 2. В существование у вас документации о настройке оборудования я не верю.

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

    Это для начала...
    Ответ написан
    2 комментария
  • Как получить нужные данные?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Может, требуется тривиальное
    SELECT *
    FROM tablename
    ORDER BY client_id IS NULL, hub_id IS NULL
    LIMIT 1

    ?
    Ответ написан
    1 комментарий
  • Как указать все необходимые адреса?

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

    Вроде бы так:

    0.0.0.0/1
    128.0.0.0/3
    160.0.0.0/5
    168.0.0.0/6
    172.0.0.0/12
    172.16.0.0/16
    172.17.0.0/17
    172.17.128.0/19
    172.17.160.0/21
    172.17.168.0/23
    172.17.170.0/24
    172.17.171.0/24
    172.17.172.0/22
    172.17.176.0/20
    172.17.192.0/18
    172.18.0.0/15
    172.20.0.0/14
    172.24.0.0/13
    172.32.0.0/11
    172.64.0.0/10
    172.128.0.0/9
    173.0.0.0/7
    174.0.0.0/6
    176.0.0.0/4
    192.0.0.0/2

    Не забудь проверить.
    Ответ написан
  • Поле json в MySQL 5.7 содержит массив типа '[1,3,5]' - как оптимально сделать выборку записей, в которых есть значения x || y || z?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT DISTINCT data.*
    FROM data
    JOIN ( 
        SELECT 2 value 
        UNION ALL 
        SELECT 5 
        UNION ALL 
        SELECT 7
        ) criteria ON JSON_CONTAINS(data.jsonarray, CAST(criteria.value AS JSON))
    Ответ написан
    2 комментария
  • Как раздавать уникальные записи таблицы во многопоточном парсере?

    @Akina
    Сетевой и системный админ, SQL-программист.
    parsed - 0 - страница еще не спаршена, 1 - страница спаршена.

    Не так.

    NULL - не парсилась.
    0 - парсинг выполнен.
    >0 - взято на парсинг соединением (функция CONNECTION_ID()) номер N.

    Соответственно попробовать зарезервировать запись на парсинг:
    UPDATE urls 
    SET parsed = CONNECTION_ID()
    WHERE parsed IS NULL
    ORDER BY datetime_added LIMIT 1;

    Получить зарезервированную запись и начать её парсинг:
    SELECT *
    FROM urls
    WHERE parsed = CONNECTION_ID();

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

    По окончании парсинга соответственно
    UPDATE urls 
    SET parsed = 0
    WHERE parsed = CONNECTION_ID();

    Ну и периодически выполняется event procedure, который находит записи, формально помеченные как обрабатываемые, но, судя по времени, обработчик подвис. Такие записи возвращаются на обработку
    CREATE EVENT clear_parsing_flag
    ON SCHEDULE EVERY 1 MINUTE
    DO
    UPDATE urls
    SET parsed = NULL
    WHERE parsed > 0
        -- считаем, что 5 минут более чем достаточно
      AND datetime_start_parsed < CURRENT_TIMESTAMP - INTERVAL 5 MINUTE;


    Само собой никаких пулов соединений, никаких открыть-закрыть - все операции выполняются в рамках одного persistent connection. Автовосстановление соединения при обрыве также запрещено.

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

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

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


    Так что задача, если разобраться, тривиальная - просто соединить два коммутатора.
    Ответ написан
    1 комментарий
  • Правильно ли я разделил сеть на подсети?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Маска подсети занимает 16 бит, но в третьем октете есть бит, который не попадает под неё. Что мне делать с этим битом?

    Задание - конечно, бредовое. 201.111.32.0/16 - это адрес хоста, а не сети, потому что адрес имеет единичные биты в области нулевых битов маски:
    Host 11001001 01101111 00100000 00000000
    Mask 11111111 11111111 00000000 00000000

    Но к тому, что преподаватели сами безграмотны, мы уже привычные... посему попробуем интерпретировать задание так: выделение производить в подсети, в которой находится узел 201.111.32.0/16 (это подсеть 201.111.0.0/16), выделяемые подсети должны располагаться не ранее указанного адреса узла, и допускать количество хостов не менее заданного.

    Начать надо с определения минимальной маски конечной подсети.
    Хостов Маска
     170     /24
     590     /22
    1500     /21
     800     /22
     254     /24

    Далее, чтобы заполнять диапазон оптимальным образом, надо выделять подсети так, чтобы они занимали наиболее широкую возможную подсеть полностью либо по максимуму. Т.е. берём заданную границу host 201.111.32.0 mask /16 и начинаем "откусывать" требуемые подсети. С целью минимизации расхода адресного пространства мы на каждом шагу распределяем самую "широкую" из подсетей, которая укладывается в текущее место.

    Сначала определяем максимальную маску для данного узла. Это будет маска /19:
    Host 11001001 01101111 00100000 00000000
    Mask 11111111 11111111 11100000 00000000

    Значит, с данного адреса мы можем сразу распределить подсеть 3. Она будет иметь адрес 201.111.32.0/21 и занимать диапазон адресов 201.111.32.0 - 201.111.39.255, последний адрес является бродкастом.

    Теперь мы распределяем оставшиеся подсети с первого свободного после уже выделенной подсети адреса 201.111.40.0. Максимальная маска для этого узла - /21. Соответственно распределяем здесь самую крупную из оставшихся подсетей. Это подсеть 2. Она будет иметь адрес 201.111.40.0/22, займёт диапазон адресов 201.111.40.0-201.111.43.255.

    Далее мы распределяем оставшиеся подсети с первого свободного после уже выделенной подсети адреса 201.111.44.0. Максимальная маска для этого узла - /22. Соответственно распределяем здесь самую крупную из оставшихся подсетей. Это подсеть 4. Она будет иметь адрес 201.111.44.0/22, займёт диапазон адресов 201.111.44.0-201.111.47.255.

    Далее мы распределяем оставшиеся подсети с первого свободного после уже выделенной подсети адреса 201.111.48.0. Максимальная маска для этого узла - /20. Соответственно распределяем здесь самую крупную из оставшихся подсетей. Это подсеть 1. Она будет иметь адрес 201.111.48.0/24, займёт диапазон адресов 201.111.48.0-201.111.48.255.

    Далее мы распределяем оставшиеся подсети с первого свободного после уже выделенной подсети адреса 201.111.49.0. Максимальная маска для этого узла - /24. Соответственно распределяем здесь самую крупную из оставшихся подсетей. Это единственная оставшаяся подсеть 5. Она будет иметь адрес 201.111.49.0/24, займёт диапазон адресов 201.111.49.0-201.111.49.255.
    Ответ написан
    2 комментария