• Выбрать строку из БД по значениям связанной таблицы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT rule.id, rule.path, rule.content, rule.cat_id 
    FROM rule
    JOIN rule_options ON rule.id = rule_options.rule_id
    WHERE rule_options.option IN (4670, 5492)
    GROUP BY 1,2,3,4
    HAVING COUNT(DISTINCT rule_options.option) = 2;
    Ответ написан
    2 комментария
  • Как выбрать данные за два периода?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT name,
           SUM(CASE WHEN {date in period 1} 
                    THEN value 
                    ELSE 0 
                    END) AS sum_1,
           SUM(CASE WHEN {date in period 2} 
                    THEN value 
                    ELSE 0 
                    END) AS sum_2
    FROM table
    WHERE {date in period 1 or 2}
    GROUP BY name
    Ответ написан
    Комментировать
  • Порекомендуйте варианты построения и оборудования для ЛВС в строящемся административно-складском здании 1500м2?

    @Akina
    Сетевой и системный админ, SQL-программист.
    • Выделение отдельного помещения для размещения внешнего ввода (Интернет и телефонные линии), кросса, серверов и активного оборудования. Металлическая дверь, кодовый замок.
    • Три линии питания - две для питания оборудования, причём запитанные от разных лучей, или хотя бы от разных фаз, плюс одна для питания кондиционера (минимум 7 кВт), плюс дежурное освещение.
    • Система пожаротушения - газовая, углекислота или фреон. Порошок - нафиг, случись что, всё оборудование можно выбрасывать и закупать новое. Воды быть не должно в принципе - даже просто проходящих через помещение труб.
    • Обязательно стойка (или стойки). Лотки, органайзеры, включая органайзеры электропитания.
    • Обязательно бесперебойники - причём время удержания должно быть минимум часа полтора, причём с учётом рабочей деградации батарей.
    • СКС разводится от розеток возле рабочих мест и до патч-панелей стойки витой парой 5 или 5е категории, чистой одножильной медью, многожилка или омеднённый алюминий ни в коем случае. Какие-то промежуточные и местные коммутаторы - забудь как страшный сон. Прокладка - по запотолочным металлическим лоткам, последний метр в коробе, монтаж на встраиваемые в короб розетки (для рабочих мест в центре комнаты - напольные короба и встраиваемые в пол розеточные блоки). Прокладка до внешних камер соответственно проводом для внешней прокладки, розетки во влагозащищённых распаечных коробках (по опыту - минимум 100х150). С розетками внутри не жадничать - на одно рабочее место минимум 2 розетки (локальная сеть, телефон), плюс дополнительные для сетевых принтеров и для точек доступа, ну и учесть, что сотрудники любят переставлять мебель самым идиотским образом. Судя по чертежам и описанию - будет штук 200 розеток.
    • Коммутаторы - управляемые как минимум L2+, PoE для подключения точек доступа, видеокамер и IP-телефонов, обычные для подключения компов и сетевых принтеров. Модель не сильно важна, но лучше сразу иметь дохрена резервных портов, чем потом докупать. Клиентские порты гигабит однозначно. Но я бы рекомендовал брать с хотя бы парой 10-гигабитных портов. Вендор по вкусу (лично я бы ставил D-Link).
    • Маршрутизатор - согласен с предыдущими товарищами насчёт Микротика вменяемой старшей модели.
    • Точки доступа - лучше сразу брать комплект для бесшовного покрытия всего здания. Насчёт количества, размещения и необходимости внешних антенн вместо встроенных ничего не скажу - это только по месту решается.


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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Во-первых, надо создать в таблице уникальный индекс по полю, которое не должно содержать дубликатов.
    Во-вторых, надо использовать INSERT IGNORE INTO, чтобы дублирование одного значения не обваливало весь вставляемый массив. Либо REPLACE INTO, если при дублировании надо полностью заменить старую запись новой. Либо INSERT ODKU, если надо обновить старые данные новыми по некоей логике (например, вставить значения в поля, в которых раньше было NULL, а теперь пришло что-то определённое). Это - для MySQL, в других СУБД синтаксис с аналогичными возможностями будет иным.
    Ответ написан
  • Как адресуются пакеты адресату с серым ip?

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

    Нет такого термина как "серый", это неопределённый до конца слэнг.

    Впрочем, неважно. Этот термин является подмножеством термина "немаршрутизируемые адреса". Т.е. адреса, маршрутизация которых запрещена. А потому любой маршрутизатор, получив для передачи пакет с немаршрутизируемым (в т.ч. и с "серым") адресом назначения, просто выбросит его. И даже не озаботится отсылкой уведомления о том, что пакет был убит.

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

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Для начала отформатируем запрос - чтобы хоть что-то было видно.
    SELECT vk_user_id, COUNT(1) AS score 
    FROM vk_scores 
    WHERE page_id IN (
        SELECT page_id 
        FROM blitz_tasks 
        WHERE stage = 1533
        ) 
    GROUP BY vk_user_id

    Учитываем, что blitz_tasks.page_id определён как NOT NULL UNIQUE (кстати, а почему не как PRIMARY KEY?), значит, запрос элементарно переписывается на INNER JOIN:
    SELECT vk_scores.vk_user_id, COUNT(*) AS score 
    FROM vk_scores 
    JOIN blitz_tasks USING (page_id)
    WHERE blitz_tasks.stage = 1533
    GROUP BY vk_scores.vk_user_id
    Ответ написан
  • Как создать строку date с автозаполнением при создании?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Reference Manual / ... / Keywords and Reserved Words

    Прочитать. Выучить. Никогда не использовать слова из списка в качестве имён объектов (таблиц, полей и пр.).
    Ответ написан
    Комментировать
  • Как посчитать количество дней подряд?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT SUM(CASE WHEN balance < 0 THEN 0 ELSE 1 END) OVER (ORDER BY date) grp
        FROM test
        )
    SELECT COUNT(*) - 1 max_cnt
    FROM cte
    GROUP BY grp
    ORDER BY 1 DESC LIMIT 1;


    fiddle (исходные украдены у Дмитрий).
    Ответ написан
    5 комментариев
  • Как задать свой тип?

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

    Можно просто добавить ограничение (CHECK constraint) - тогда любое не соответствующее ограничению значение приведёт к ошибке вставки/обновления:

    CREATE TABLE video (
      id INTEGER,
       ...,
      type VARCHAR CHECK (type IN ('FILM', 'SERIAL')),
      ...
    );
    Ответ написан
    Комментировать
  • Как получить значения и вставить в функцию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как-то вот так:
    SELECT *
    FROM table t1 
    JOIN table t2
    WHERE t1.id > t2.id
      AND ST_Intersect(t1.geom, t2.geom)
    Ответ написан
    Комментировать
  • Установка mysql - ошибка 1045(28000)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    - ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)


    Выделенный фрагмент чётко указывает на причину - использованная строка запуска не настроена на передачу пароля.

    Дословно сообщение означает: пользователя 'root'@'localhost' не получилось аутентифицировать с пустым паролем. Всё, не больше и не меньше. А по какой причине - пароль не пуст, такого юзера нет, или вообще это роль, а не юзер - сообщение установить не позволяет.

    Как фиксить - уже сказано в комментарии, который сделал Максим Припадчев.
    Ответ написан
    Комментировать
  • Как сделать проверку базы данных, на наличие новых записей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если количество новых записей невелико (в пределах тысячи), то возможное решение - триггер на основной таблице, который копирует свежевставленные записи в дополнительную таблицу. Тупо один к одному. А процедура проверки на свежие записи столь же тупо выгребает из этой дополнительной таблицы всё туда упавшее, после чего чистит её.
    Ответ написан
  • Как работать с файлом SQL объемом 20 ГБ?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В комментариях выше фиксируются следующие факты:
    • используемая СУБД - MySQL
    • (вероятно) дамп - MySQL либо MariaDB
    • дамп поделен на несколько частей
    • задача - периодическая

    Соответственно некоторые соображения в дополнение к сказанному ранее.

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

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

    PS. 40 записей в секунду - это в общем-то ни о чём..
    Ответ написан
    Комментировать
  • Как поставить кастомную скорость Ethernet?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Видел на ноутбуке (сетевая карта 100 на 100) как он по сети давал 125 на 75.

    Ты тупо не понял, что видел. Отключи кэширования со стороны дисковой и сетевой подсистем - и хрен ты увидишь такие значения.

    Хотелось бы на сервере и на потребителе выставить настройки сетевого порта 1950 на 50, чтобы при скачивании с сервера скорость была в два раза выше.

    Невозможно даже теоретически.

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

    А в полудуплексе они синхронны в рамках общей, суммарной, скорости в 1 Гбит - т.е. когда один канал работает, встречный отдыхает.

    -----------------

    Для увеличения скорости обмена можно доставить по второй сетевой карте и агрегировать эти два канала в один логический. Впрочем, до 1950 добраться всё равно не получится.

    Либо (самое правильное решение) докупить и поставить более высокоскоростные сетевые карты. Стоимость решения в случае 10G портов - порядка 9 тыр за порт.
    Ответ написан
    Комментировать
  • Какой sql запрос нужен чтобы получить последнюю дату события для каждого домена?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY domain ORDER BY date DESC) AS rn
        FROM Crawl_Datetime
    )
    SELECT * 
    FROM cte
    WHERE rn = 1
    Ответ написан
    Комментировать
  • Почему очень долго выполняеться alter table в mysql 8 ubuntu?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. Вставьте в запрос явное создание индекса для работы внешнего ключа.
    2. Выполните действия тремя отдельными ALTER TABLE и выясните, какая именно операция занимает так много времени. Попробуйте явно указать для неё алгоритм выполнения.
    3. Спецификация CHAR(36) BINARY намекает, что там будет текстовое представление UUID. Да и имя поля намекает на то же самое. Но если так - то какой смысл в BINARY? чтобы потом надо было думать, что делать с регистрозависимостью? И вообще - почему бы не упаковать UUID в BINARY(16)? да, потребуется преобразование при вводе-выводе, зато ускорится обработка.
    4. ON UPDATE NO ACTION - это что, `billInc` (`uuid`) неуникальное, что ли? А сколько вообще записей в `billInc`?
    Ответ написан
    Комментировать
  • Как узнать позицию записи в базе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT COUNT(*) AS row_position
    FROM table_name t1
    JOIN table_name t2 ON t1.ordering_column >= t2.ordering_column
    WHERE t2.identifying_column = 'Объявление 7'
    Ответ написан
    Комментировать
  • Как создать порядковый номер для заказа конкретного заведения?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации.
    -- рабочая таблица
    CREATE TABLE orders (
      id INT AUTO_INCREMENT PRIMARY KEY,
      project_id INT,
      project_number INT
      );

    -- опорная таблица для генерации номеров в разрезе проектов
    CREATE TABLE generate_project_number (
      project_id INT,
      project_number INT AUTO_INCREMENT,
      PRIMARY KEY (project_id, project_number)
      ) ENGINE = MyISAM;

    -- триггер-генератор
    CREATE TRIGGER generate_project_number
    BEFORE INSERT ON orders
    FOR EACH ROW
    BEGIN
      -- вставить хапись в опорную таблицу для генерации номера
      INSERT INTO generate_project_number (project_id) VALUES (NEW.project_id);
      -- вставить сгенерированный номер в рабочую таблицу
      SET NEW.project_number = LAST_INSERT_ID();
      -- почистить опорную таблицу от лишних записей
      DELETE FROM generate_project_number 
      WHERE project_id = NEW.project_id
        AND project_number < NEW.project_number;
    END

    DEMO fiddle
    Ответ написан
    Комментировать
  • В чем состоит разница между "WHERE" и "AND" в LEFT JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В чем состоит разница между "WHERE" и "AND" в LEFT JOIN?

    Тем, что AND operator может использоваться в том месте запроса, где он оказывает влияние на связывание с использованием LEFT JOIN (в составе выражения в ON clause), тогда как WHERE keyword в принципе не может использоваться в таком месте.
    Ответ написан
    Комментировать