Задать вопрос
  • Как в PosgreSQL, в JSON добавить key:value?

    @Akina
    Сетевой и системный админ, SQL-программист.
    https://www.postgresql.org/docs/current/functions-...

    Оператор конкатенации JSONB - ||

    В более сложных случаях - jsonb_set(), jsonb_insert()... в общем, посмотри сам.
    Ответ написан
    Комментировать
  • Что конкретно делает wi-fi wi-fi'ем?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Что конкретно делает WI-FI WI-FI?

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Хранить следует в формате для хранения даты (с учётом необходимости дополнительного хранения информации о зоне времени). Если СУБД имеет встроенный тип DATE - следует использовать его. Если такого нет - DATETIME. Если и такого нет - TIMESTAMP.

    Вводить следует в том формате, в каком согласно документации следует представлять литералы даты.
    Ответ написан
    Комментировать
  • Как задать поиск по совпадения в 2 и более слов?

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

    Нет. Вернее, этого недостаточно.
    Условие WHERE name LIKE '%сок%перс%', конечно, не пропустит указанные нежелательные записи - но и "Персиковый сок" тоже будет отброшен.

    Нужно проверять наличие каждого слова отдельно.

    SELECT *
    FROM table
    WHERE name LIKE '%сок%'
      AND name LIKE '%перс%';
    Ответ написан
    Комментировать
  • Как получить сумму стоимости товаров из массива json?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT test.id, SUM(jsontable.price) total_price
    FROM test
    CROSS JOIN JSON_TABLE(test.data,
                          '$.products[*]' COLUMNS (price INT PATH '$.price')) jsontable
    GROUP BY test.id

    fiddle
    Ответ написан
    Комментировать
  • Как выбрать нужные позиции в базе по датам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM tablename
    WHERE data < CURRENT_DATE + INTERVAL 5 DAY
    -- AND data >= CURRENT_DATE
    Ответ написан
    Комментировать
  • Как добавить данные для каждого массива в трехмерным массиве PHP?

    @Akina
    Сетевой и системный админ, SQL-программист.
    $db->prepare("SELECT comments.id, ... , users.login
                       , :me AS me 
                  FROM `comments` ... ");
        $comments->execute([
        "id_post" => $dataAttr,
        "me" => $_SESSION["user"]["id_user"],
        ]);

    или типа того...
    Ответ написан
    1 комментарий
  • Как выбрать дату последней транзакции (чтоб эта транзакция была 7 дней назад)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT id AS servie_id,
           name AS servie_name,
           MAX(TO_TIMESTAMP(created_at))::DATE AS last_trans_date
    FROM services
    GROUP BY 1,2
    HAVING last_trans_date <= CURRENT_DATE - INTERVAL '7 day'
    Ответ написан
    Комментировать
  • Где ошибка в EXECUTE FORMAT?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE OR REPLACE FUNCTION _Foo2(st TIMESTAMP, fin TIMESTAMP)
    RETURNS TABLE (out_key INTEGER, out_tst timestamptz, out_val FLOAT) AS $$
    DECLARE  
      
    BEGIN
    
      RETURN QUERY EXECUTE FORMAT('
      SELECT %I, %I, %I
      FROM %I 
      WHERE %I BETWEEN ''%s'' AND ''%s'';
      ', 
      'in_key', 'in_tst', 'in_val', 'in_table', 'in_tst', st, fin);
    
    END;
    
    $$ LANGUAGE plpgsql;


    DEMO fiddle

    Ошибки найдёте самостоятельно...
    Ответ написан
    1 комментарий
  • Как исправить ошибку Cannot add or update a child row: a foreign key constraint fails?

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

    Ну тебе же вменяемо говорят, что не выполняется ограничение.

    Согласно ограничению то значение, которое ты вставляешь в поле dispatcher таблицы transportation в базе данных auto, уже должно существовать в поле id_dispatcher таблицы dispatcher той же базы.

    Так что следи, что идентификатор диспетчера, который ты присваиваешь полю, взят не с потолка.
    Ответ написан
    5 комментариев
  • Как сделать модуль VBA по умолчанию при создании книги Excel?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Есть минимум два варианта.
    Первый - предпочтительный, но ссылку на него уже дал datka.
    Второй - откорректировать шаблон по умолчанию. См. тут
    Ответ написан
    Комментировать
  • Как удалить все в строке после последнего пробела через Notepad++?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Найти: +[^ ]+$ (в начале перед плюсом один пробел)
    Заменить: (пустая строка)

    Режим - регулярные выражения, зацикленный поиск.

    Удаляет всё от последнего пробела до конца строки, если строка оканчивается не-пробелом. Удаляет и сам последний пробел (если их несколько - удаляет все). Если последний символ в строке пробел - не удаляет ничего.
    Ответ написан
    Комментировать
  • Как лучше сохранять дату и время?

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

    Соответственно "справочник дат" - дурь, не имеющая права на существование.

    Для хранения дат в любой СУБД есть соответствующие встроенные типы (их, как правило, не один). Хранение значения даты "кусками" - точно такая же не имеющая право на существование дурь. До тех пор пока выделяемые в отдельные поля компоненты этой даты не являются самостоятельной сущностью. Но в этом случае вычисляемое поле скорее всего будет более разумным решением.
    Ответ написан
    Комментировать
  • Какие ограничения несёт в себе INSERT IGNORE для секционированных таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    INSERT INTO может привести к ошибке. По любой причине. При этом процесс вставки прерывается, а все уже внесённые в таблицы изменения - откатываются.

    INSERT IGNORE преобразует ошибку в предупреждение. При этом выполнение запроса продолжается, а запись, попытка вставки которой привела к ошибке, не вставляется.

    Замечание. Дублирование - не единственное событие, которое может вызвать ошибку. Может быть ещё куча причин (CHECK constraint, SIGNAL из триггера, нарушение внешнего ключа и т.п.). Причём далеко не все типы ошибок восстановимы и могут быть проигнорированы/преобразованы в предупреждение. Если ошибка невосстановимая (как правило, это системные или внешние ошибки) - запрос прерывается по ошибке и откатывается обычным образом.

    Замечание 2. Всё вышеописанное никак не пересекается с секционированием. За исключением случая, когда значение поля не соответствует диапазону ни для одной из секций. В этом случае IGNORE срабатывает штатно - ошибка преобразуется в предупреждение, проблемная запись не вставляется.

    Нужно игнорировать дублирующиеся данные. Буду делать INSERT IGNORE

    Кроме INSERT IGNORE INTO есть ещё два типа запросов, которые обрабатывают ошибку дублирования данных - это INSERT .. ON DUPLICATE KEY UPDATE и REPLACE INTO. Изучите их - возможно, какой-то из них лучше подходит для Вашей конкретной задачи. При этом REPLACE не поддерживает модификатор IGNORE и не может игнорировать другие ошибки.
    Ответ написан
    2 комментария
  • #1045 - Доступ закрыт для пользователя 'root'@'127.0.0.1', что делать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В OpenServer -> PHPMyAdmin я создал юзера root1

    Мало создать юзера, надо ещё дать ему необходимые для работы права. Хотя бы элементарно на чтение для той БД, которая указана как база по умолчанию.

    Вот параметры юзера

    Право USAGE - это синоним права “no privileges”. Т.е. свежесозданный юзер - абсолютно бесправен.

    Читайте и применяйте GRANT Statement. Особое внимание обратить на WITH GRANT OPTION.
    Ответ написан
    Комментировать
  • Как заставить работать COUNT с GROUP BY?

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

    Вариантов несколько.

    Первый, наиболее правильный - получить это значение отдельным запросом.
    SELECT COUNT(*)  AS cnt
    FROM (
        SELECT 1
        FROM "order" AS o
             LEFT JOIN product p ON (p.order_id = o.id)
        GROUP BY o.id
        HAVING sum(p.price) >= 10
    ) x


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

    Третий - добавить соотв. поле в каждую запись выходного набора, используя оконную функцию, и взять значение из любой записи:
    SELECT o.id, COUNT(o.id) OVER () AS cnt
    FROM "order" AS o
             LEFT JOIN product p ON (p.order_id = o.id)
    GROUP BY o.id
    HAVING sum(p.price) >= 10
    Ответ написан
  • Как объединить два запроса в один?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT order.ID, 
           order_status.Name StatusName, 
           order.Name OrderName, 
           order.Phone
    FROM order
    JOIN order_status ON order.status = order_status.id

    Если соответствие в таблицах задано иначе - исправь ON clause.
    Ответ написан
    2 комментария
  • Агрегирование в контексте группы и оконной функции?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как отработает этот запрос?
    внутренний sum посчитает сумму в рамках групп бай, если ins_date равна cur_date, а потом внешний sum суммирует полученный результат в контексте секций?

    Именно так и будет. Считай, что оконные функции работают после HAVING и перед ORDER BY.
    Ответ написан
    Комментировать
  • Как правильно удалить все строки с минимальным значением поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Удалить только самые старые (оставить все остальные)
    DELETE t1
    FROM table t1
    LEFT JOIN table t2 ON t1.dup_column = t2.dup_column
                      AND t1.time_column > t2.time_column
    WHERE t2.time_column IS NULL

    Оставить только самые новые (удалить все остальные)
    DELETE t1
    FROM table t1
    JOIN table t2 ON t1.dup_column = t2.dup_column
                 AND t1.time_column < t2.time_column


    Суть задачи удалить все дубли квартир приходящие с разных импортов, по умолчанию считаем что последний файл импорта актуальный

    Создай уникальный индекс по номеру квартиры (после чистки, само собой) и используй не INSERT INTO, а REPLACE INTO.
    Ответ написан