Задать вопрос
  • Как распарсить строку?

    @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 комментарий
  • Как заменить строку на цифры у оператора IN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если передаваемый параметр - это CSV идентификаторов, то следует использовать
    SELECT *
    FROM `users`
    WHERE FIND_IN_SET(id, ?);


    Примечание 1. CSV не должен содержать никаких паразитных пробелов (а то любят всякие "украшатели" понатыкать пробелов после запятой).
    Примечание 2. Такой запрос - гарантированный фуллскан. Зато не будет инъекции.

    PS. В принципе этот CSV несложно довести до состояния JSON array (всего-то две скобки добавить) - тогда можно применить JSON_CONTAINS(), что может быть немного быстрее. А уж если переданный JSON распарсить на отдельные значения с помощью JSON_TABLE(), так ещё и от фуллскана избавимся (правда, версия сервера нужна достаточно свежая).
    Ответ написан
    2 комментария
  • Почему выдает ошибку 1442?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE DEFINER=root@localhost
    TRIGGER bi_trigger_in_employees
    BEFORE INSERT ON employees 
    FOR EACH ROW 
    SET NEW.entpr_name = COALESCE( NEW.entpr_name, 
                                   ( SELECT ap_name 
                                     FROM companies 
                                     WHERE id = NEW.entpr_id 
                                     LIMIT 1
                                    )
                                  ),
        NEW.employee_name = COALESCE( NEW.employee_name, 
                                      ( SELECT CONCAT_WS(' ',np_surname,np_name,np_patronymic) 
                                        FROM people 
                                        WHERE id = NEW.employee_id
                                        LIMIT 1
                                       )
                                     );

    1) Суть ошибки - именно та, что написана в сообщении. Нельзя UPDATE таблицы, на которой определён триггер (и другие DML - тоже нельзя).
    2) Изменять вставляемые значения надо до вставки, а не после. Потому BEFORE триггер.
    3) По-хорошему, нужен ещё аналогичный BEFORE UPDATE триггер.
    4) Все SET выполняются в одном операторе (см. https://dev.mysql.com/doc/refman/8.0/en/set-variab...). А триггер из одного оператора обходится и без BEGIN-END, и без DELIMITER.
    5) При скалярном присвоении из подзапроса ВСЕГДА добавляйте LIMIT 1. А по-хорошему ещё и ORDER BY. На показанный код ни то, ни другое не влияет - всё равно одна запись, ибо отбор по PK. Но вдруг структура поменяется, а про триггер забудете? Начнутся ошибки - оно надо?

    тогда да, ошибка на бесконечный цикл. Но тут почему?

    Как это ни странно, но в теле триггера неизвестно, на какое событие определён триггер.
    Ответ написан
    1 комментарий
  • Как посчитать сумму по двум столбцам в таблице, за прошлую неделю от текущей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT *, DENSE_RANK() OVER (ORDER BY period DESC) drnk
        FROM source_table
    )
    SELECT period,
           SUM(some_value) AS 'Количество order_cost', 
           SUM(just_value) AS 'Количество доставок', 
    FROM cte
    WHERE drnk = 2
    GROUP BY 1;
    Ответ написан
    Комментировать
  • Почему подсеть перестает видеть при включении прокси?

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

    Не надо слушать каждого начальствующего придурка. Его дело - поставить задачу и заткнуться. А вот как её решать и что для этого решения делать - должен решать ты. Подключив к процессу голову.

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

    А все рабочие станции по-прежнему ходят в Инет через него - но по новому каналу. На них вообще никакие настройки не должны меняться.

    Почему подсеть перестает видеть при включении прокси?

    Потому что все маршруты похерены. Клиент пытается искать другие подсети через новый канал. И ещё ваше счастье, что новый провайдер не отрубил вас за серый флуд.
    Ответ написан
    Комментировать
  • Как правильно назначать порты?

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

    1. Выполнить опрос системы на предмет неиспользуемых портов в диапазоне пользовательских (49152—65535, кроме зарезервированных) портов. Выбрать из них необходимое количество портов и захватить их.
    2. Сформировать некий сервис (например, HTTP-сервер) на некоем незарезервированном статически назначенном порте из диапазона назначаемых программных портов (4096-49151), к которому клиент может обратиться и получить список захваченных для работы сервиса портов.
    Ответ написан
    Комментировать