Задать вопрос
  • Как сделать чтобы заблокированные сайты работали без включения впн или прокси?

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

    Используйте браузерный плагин избирательного использования VPN. Который только для сайтов из списка использует подключение через VPN, а остальные пропускает напрямую.
    Ответ написан
  • Что быстрее поиск по файлу JSON в PHP или в базе посредством MySQL?

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

    Определитесь. Или в приоритете скорость, или нагрузка. Но не то и другое одновременно.

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

    Если приоритетна нагрузка - то поиск следует производить средствами СУБД.
    Ответ написан
    Комментировать
  • Как оптимизировать INSERT запросы в PDO(phpmyadmin)?

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

    На стороне PHP имеется массив строк:

    aaa
    bbb
    ccc

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

    Первое - объединяем/сериализуем этот массив в одно значение. Допустим, выбрали JSON массив. То есть ["aaa", "bbb", "ccc"]
    И именно этот JSON мы передадим в запрос.

    Далее на стороне MySQL надо разобрать JSON на элементы и вставить в таблицу. Это делается одним запросом.
    INSERT INTO destination_table (single_value)
    SELECT single_value
    FROM JSON_TABLE( ? ,
                     '$[*]' COLUMNS ( single_value VARCHAR(255) PATH '$' )) jsontable;

    И... а, собственно, всё.

    Осталось только убедиться, что размер строкового представления данных не превышает установленный в MySQL размер входящего пакета, и, если превышает, то соответствующим образом подрихтовать сессионную переменную max_allowed_packet. Впрочем, дефолтно там 67108864 байтов, это порядка 1480 байтов на элемент - должно хватить.
    Ответ написан
    Комментировать
  • Как пробросить компьютер в другую сеть?

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

    Именно из Интернета? или из сетки 192.168.1.0/24?

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

    Ну правильная идея. Причём карты будут работать одновременно, и ничего настраивать не нужно. Ведь, как я понимаю, в 198.148.46.0/24 ни дефолтного шлюза, ни статических маршрутов нет.

    Другой вопрос - если сеть изолирована от Инета, то, наверное, не просто так? и, значит, следует на этом двухинтерфейсном компе принять все необходимые меры безопасности. В том числе запретить маршрутизацию и локальный транзит (пакеты на адрес второго интерфейса из сети первого).
    Ответ написан
    2 комментария
  • Гибридные, транковые порты на коммутаторах, это всё порты для коммутаторов? Не для конечных устройств?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Гибридные, транковые порты на коммутаторах, это всё порты для коммутаторов? Не для конечных устройств?

    В общем - нет. Как правило - да.

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

    подружить 2 VLAN (2 сети) на одном конечном устройстве?

    Так вланы, и в них сети, разные, или разные сети в одном влане?
    Ответ написан
  • Как вставить все значения у всех таблиц через JOIN?

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

    INSERT INTO main (table1_id, table2_id) 
    WITH 
    cte1 AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) rn FROM table1 ),
    cte2 AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) rn FROM table2 )
    SELECT cte1.ID, cte2.ID
    FROM cte1
    JOIN cte2 USING (rn);
    Ответ написан
  • Не получается настроить внутреннею сеть между двумя виртуальными Linux машинами в VirtualBox?

    @Akina
    Сетевой и системный админ, SQL-программист.
    pfSense
    Интерфейс WAN, который должен смотреть в Инет - VMNet8 (NAT), адрес по DHCP, либо VMNet0 (direct), статический адрес.
    Интерфейс LAN - любой внутренний VMNet (например, VMNet2), статический адрес.

    Cервер Metasploitable, интерфейс в этом сегменте - тот же VMNet (VMNet2), адрес статический.
    Клиенты Ubuntu и Kali - тот же VMNet, адреса статические либо динамические, дефолт-шлюзом LAN-адрес pfSense. Статический маршрут в подсеть частного клиента Ubuntu через адрес Metasploitable в этом сегменте.

    Второй интерфейс сервера Metasploitable - в другой внутренний VMNet (скажем, VMNet3), статический адрес из другой подсети.
    Клиент Ubuntu за ним - к тому же VMNet (VMNet3), адрес статика или динамика. Дефолтным шлюзом адрес Metasploitable из этого сегмента.
    Ответ написан
    Комментировать
  • Магия в топологии сети, объясните как такое возможно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пинг, вернее, ответ на него - самая низкоприоритетная из всех задач коммутатора. Так что если он занят чем-то более важным, то просто не ответит. Бывает, что даже на пинги устройству, подключенному непосредственно к коммутатору, получают только половину ответов. Это нормально.
    А другие пингуемые нагружены, видимо, меньше, или производительность у них больше - вот потерь и нет.
    Ответ написан
    Комментировать
  • Что я делаю не так, почему MySQL ругается?

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

    create table if not exists dialogs (
        id int primary key auto_increment, 
        user_id_one int not null, 
        foreign key (user_id_one) references users (id), 
        user_id_two int not null, 
        foreign key (user_id_two) references users (id)
    )
    Ответ написан
    Комментировать
  • Как найти следующую строчку в mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH
    cte AS (
      SELECT *, COALESCE(LEAD(id) OVER (ORDER BY id),
                         MIN(id) OVER ()) next_row_id
      FROM comments
    )
    SELECT * 
    FROM cte
    Ответ написан
    Комментировать
  • Можно ли в хранимых процедурах создать временную функцию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE FUNCTION не входит в список конструкций, разрешённых к использованию в stored objects (procedures, functions, triggers, event procedures) и prepared statements.

    Ответ: НЕЛЬЗЯ.

    PS. В MySQL нет временных функций, все функции - статические. Встроенные, регистрируемые либо хранимые.
    Ответ написан
    1 комментарий
  • PHP не создаёт запись MySQL, ошибки не выводит, что делать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    No index used in query/prepared statement ...

    что это означает?

    Это означает, что, по мнению PHP/mysqli, нет подходящего индекса для обработки запроса, сервер будет шерстить всю таблицу, что неэффективно. В общем, он просто старается сделать тебя счастливым (твоё мнение при этом никого не интересует).
    Возможные решения:
    1. Создать индекс users (username)
    2. Изменить настройки mysqli_report() (см. ответ SagePtr)

    без неё обойтись нельзя, т.к. одинаковые ники будут вызывать ошибки в некоторых уголках сайта
    что делать?

    Тогда альтернатив вообще нет.

    Создать уникальный индекс users (username).

    После этого код с проверкой на существование можно смело выбросить (дубликат в принципе не будет записываться сервером). Но обязательно добавить код для обработки ошибки дублирования при добавлении.
    Ответ написан
    Комментировать
  • Как правильно реализовать систему групп у пользователя?

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

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

    FROM post
    JOIN user ON user_id = {текущий пользователь} AND FIND_IN_SET(post.group_id, user.group_ids_csv)

    Однако функция в связи - это прощай индексы и здравствуй фуллскан.

    ID username group
    1 admin 1,2,3


    Дурацкая схема хранения.
    Если есть связь M:N, то должна быть связующая таблица (user_id, group_id).
    Ответ написан
  • Как сделать жесткое исключение NOT IN в mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Разумнее использовать WHERE NOT EXIST, который скорее всего будет более эффективен:
    SELECT [DISTINCT] number
    FROM table t1
    WHERE service NOT IN (1,2,3)
      AND NOT EXISTS (
        SELECT NULL
        FROM table t2
        WHERE t1.number = t2.number
          AND t2.service IN (1,2,3)
    )

    Индекс по (number, service) - весьма желателен.

    Если service - целочисленное поле со значениями от единицы и более, то для даных конкретных условий можно построить и более эффективный запрос:
    SELECT number
    FROM test
    GROUP BY number
    HAVING MIN(service) > 3
    Ответ написан
    Комментировать
  • Ошибка #1064. Как объявлять переменные в mysql 8.0?

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

    Есть переменные локальные. Они определяются в рамках блока кода в хранимой конструкции (функция, процедура, триггер и пр.), имеют определённый тип, и существуют только в том блоке, в котором определены. Имя начинается НЕ с символа @.

    Есть переменные, определённые пользователем. Имя начинается с символа @. Не требуют определения, существуют в течение всей сессии.

    В показанном коде - мешанина. Попытка определить пользовательскую переменную, что приводит к ошибке синтаксиса. Показанный код был бы корректен в MS SQL (SQL Server), но не в MySQL.

    В общем, собак - убрать. Всех.
    Ответ написан
  • Триггер UPDATE с условием?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример
    CREATE FUNCTION fn_test() 
    RETURNS TRIGGER
    AS $fn_test$
    BEGIN
        IF OLD.val1 <> NEW.val1 THEN   -- задать условие
            NEW.id := NEW.id * 10;     -- выполнить действие
        END IF;
        RETURN NEW;
    END;
    $fn_test$ LANGUAGE plpgsql;

    CREATE TRIGGER tr_test
    BEFORE UPDATE ON test
    FOR EACH ROW
    EXECUTE FUNCTION fn_test();

    DEMO

    Или так:
    CREATE FUNCTION fn_test() 
    RETURNS TRIGGER
    AS $fn_test$
    BEGIN
        NEW.id := NEW.id * 10;     -- выполнить действие
        RETURN NEW;
    END;
    $fn_test$ LANGUAGE plpgsql;

    CREATE TRIGGER tr_test
    BEFORE UPDATE ON test
    FOR EACH ROW
    WHEN (OLD.val1 <> NEW.val1)   -- задать условие
    EXECUTE FUNCTION fn_test();

    DEMO
    Ответ написан
    2 комментария
  • Как посчитать количество сотрудников в штате за каждый месяц в каждом году?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH RECURSIVE
    cte AS ( SELECT CAST(DATE_FORMAT(@range_from, '%Y-%m-01') AS DATE) month_start,
                    LAST_DAY(@range_from) month_end
             UNION ALL
             SELECT month_start + INTERVAL 1 MONTH,
                    LAST_DAY(month_start + INTERVAL 1 MONTH)
             FROM cte
             WHERE month_start < DATE_FORMAT(@range_till, '%Y-%m-01')
    )
    SELECT cte.month_start, COUNT(employee.id) employees_amount
    FROM cte
    LEFT JOIN employee ON employee.date_employment <= cte.month_end
                      AND (    employee.date_dismissal >= cte.month_start
                            OR employee.date_dismissal IS NULL )
    GROUP BY 1;

    https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=8be...
    Ответ написан
    4 комментария
  • Чем отечественным заменить Mikrotik?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Официальный сайт реестра российской радиоэлектронной продукции (РРПО) — https://gisp.gov.ru/documents/10546664/

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT COALESCE( 
        (
            SELECT busy FROM `all_reservs` WHERE dates ='27.06.22' AND number='22' LIMIT 1
        ), 
        'no'
    ) AS busy;

    Если запрос вернёт запись (с одним полем), скаляризация преобразует её в значение, и COALESCE вернёт это значение.
    Если запрос не вернёт запись, скаляризация вернёт NULL, и COALESCE вернёт 'no'.
    LIMIT страхует от возврата более чем одной записи. По-хорошему ещё надо добавить ORDER BY.
    Ответ написан
    1 комментарий
  • Как сделать ORDER BY совместно с GROUP BY в MySQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT t1.*
    FROM table AS t1
    NATURAL JOIN (
        SELECT user_id, MAX(timestamp) AS timestamp
        FROM table AS t2
        GROUP BY 1
    ) AS t3


    Если вдруг для юзера время может иметь дубликаты - будут выведены все соотв. записи.
    Ответ написан
    Комментировать