Задать вопрос
  • Как вывести элемент, если нет связи many to many?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Шаблон при решении такого рода задач следующий:
    SELECT *
    FROM products 
    CROSS JOIN categories
    LEFT JOIN products_category USING (product_id, category_id)

    CROSS JOIN генерирует все возможные комбинации, а потом LEFT JOIN либо присоединяет к комбинации реально существующие данные, либо нет - тогда в соотв. полях одни NULL. Ну а что именно выводить - это уже решается по конкретной задаче.
    Ответ написан
  • Как синхронизировать столбцы в SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если связь между значениями - статическая, жёсткая и никогда не изменяемая, то используйте вычисляемое поле (generated column). Если значение поля, от которого зависит другое поле - числовое от единицы и далее, можно обойтись одним полем типа ENUM.

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

    Крайний случай - использование BEFORE INSERT/UPDATE триггеров.
    Ответ написан
    Комментировать
  • Как правильно будет сделать JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    andry33822, огорчу. Описанная мной в комментарии к вопросу процедура требует ВСТАВКИ записи в таблицу users и ОБНОВЛЕНИЯ существующей записи в таблице users_apikey. То есть INSERT в одну таблицу + UPDATE другой таблицы.

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

    CREATE TRIGGER tr_assign_apikey_to_user
    AFTER INSERT 
    ON users
    FOR EACH ROW
    UPDATE users_apikey SET username = NEW.username WHERE username = '' LIMIT 1;


    DEMO fiddle

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT t1.*, t2.category_id AS main_category_id
    FROM table t1
    JOIN table t2 USING (product_id)
    WHERE {условия по таблице t1, определяющие нужный продукт}
      AND t2.main_category
    Ответ написан
    2 комментария
  • Как вернуть первые N максимальных элементов из массива без сортировки массива?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Да собсно создаёшь итоговый массив размером N и перебираешь элементы исходного массива, помещая их в итоговый массив с поддержанием сортированности последнего. Соответственно первые N элементов исходного просто помещаются туда с сортировкой, а все последующие либо не помещаются, если они меньше наименьшего, либо помещаются в правильное место, чтобы сохранялась сортированность, выдавливая при этом наименьший из элементов. По завершении перебора в итоговом массиве находится требуемое число максимальных элементов.
    Ответ написан
    Комментировать
  • Как прибавить к текущей дате дни?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В случае MySQL просто прибавить соотв. INTERVAL:
    INSERT INTO `order`
    SET ...
        date_end = CURRENT_DATE + INTERVAL :days_to_add DAY

    В других СУБД - использовать функцию DATEADD().
    Ответ написан
    Комментировать
  • Как запустить OPTIMIZE_TABLE через shell скрипт для конкретных БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Создайте хранимую процедуру, которая принимает имя БД и выполняет нужную команду для каждой таблицы базы. И выполняйте её.
    Ответ написан
    Комментировать
  • Что происходит при повторном запуске команды MySQL source?

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

    Никаких проверок. Запуск с самого начала.

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

    В общем, как обычно. Если возникла ошибка, надо не пытаться запустить повторно, типа авось пролезет (почти наверняка - не пролезет), а разбираться, почему возникла ошибка, и устранять причину.
    Ответ написан
    Комментировать
  • Postgresql как преобразовать пустую строку в "Не отправлено"?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Что такое "пустая строка", строка нулевой длины или NULL? Впрочем, оба случая накрываются конструкцией
    COALESCE(NULLIF(status, ''), 'Не отправлено')
    Если в status может быть горсть пробелов - предварительно тримануть.
    Ответ написан
    Комментировать
  • Как восстановить базу sql из файлов /var/lib/mysql/* на другом сервере mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    При попытки создать mysqldump база выдаёт ошибку:
    Illegal mix of collations (utf8_unicode_ci,COERCIBLE) and (utf8_general_ci,COERCIBLE) for operation 'locate'

    Скорректируйте @@collation_connection.

    Задача сделать копию битой БД mysql ... как из файлов "холодного резерва" создать sql-файл или как эту базу развернуть на другом сервере mysql?

    А смысл? если подключить файлы данных в новом местоположении, ошибки никуда не денутся.

    А так - создать таблицы в новом местоположении. Структура должна совпадать с точностью до запятых, и версия сервера тоже. Самое разумное - сделать бэкап чисто структуры, без данных, и развернуть. А потом DISCARD/IMPORT TABLESPACE, либо замена файлов при остановленном сервисе и последующий запуск с лечением и перезаписью метаданных и статистики.
    Ответ написан
  • Законно ли писать программу из процедур без in/out параметров, которые оперируют глобальными переменными?

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

    Ну что вы так сразу все набросились-то? Придурок писал, увольняйся нафиг... Вопрос совершенно чётко утверждает, что программа, созданная инициативно, полностью готова и корректно выполняет всё в неё заложенное - так что создавший её как бы не совсем придурок-то. А то, что руководство требует её развивать, однозначно говорит, что она ещё и полезна.

    Как я понимаю, программа эта выполняется локально и монопольно, вряд ли многопоточная, и даже допускаю, что не разрешающая одновременного запуска нескольких инстансов (хотя вот это уже совсем предположение). А потому не вижу никаких противнопоказаний к нормальному рефакторингу и получению в конечном итоге приложения, сохранившего весь функционал, но написанного "по науке".

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

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

    Такие программы сплошь и рядом начинаются как маленькие приблуды, создаваемые одним работником для себя, для облегчения своей работы и снятия с себя тупой рутины. И работодатель тут вообще никаким боком - он не поручал и не заказывал, оно само родилось. И тут уж как работник смог, так и сделал. И то, что программа не просто работает, но и полезна настолько, что принято решение её развивать и это развитие оплачивать - так это работнику жирный плюс.
    Ответ написан
    2 комментария
  • Правда ли что логический порядок выполнения запроса может не совпадать с планировщиком?

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

    А вот с планом он совпадает на 100% - ну просто потому что выполняется именно по этому плану.
    Ответ написан
    Комментировать
  • Как правильно импортировать много данных из json в mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Artikul2,
    MySQL 8.0.28-0ubuntu0.20.04.3


    Не делай ничего с этим JSON. Отдай его как есть на MySQL - у него парсинг получится лучше...
    INSERT INTO test (name, position, city, postcode, entered_at, income)
    SELECT data ->> '$[0]' name,
           data ->> '$[1]' position,
           data ->> '$[2]' city,
           data ->> '$[3]' postcode,
           STR_TO_DATE(data ->> '$[4]', '%Y\/%m\/%d') entered_at,
           REPLACE(SUBSTRING(data ->> '$[5]' FROM 2), ',', '') income
    FROM JSON_TABLE(@data,
                    '$.data[*]' COLUMNS (data JSON PATH '$')) jsontable


    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=8c5e1c...

    Если надо отсеивать дубликаты - создать соотв. уникальный индекс, и использовать INSERT ODKU, REPLACE INTO либо INSERT IGNORE.
    Ответ написан
  • Как правильно создать запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    DELETE t1 
    FROM review_detail t1
    JOIN review_detail t2 USING (title, nickname)
    WHERE t1.detail_id < t2.detail_id;

    https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=dc6a90...
    Ответ написан
    2 комментария
  • Как сменить пользователя в MySQL?

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

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

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

    Этап 1.

    Строим выпуклую оболочку. Использованные точки отбрасываем. По оставшимся опять строим выпуклую оболочку... В итоге получаем несколько вложенных непересекающихся оболочек и, возможно, 1-2 точки внутри самой внутренней из них.

    Этап 2.

    Соединяем каждую из оболочек с ближайшей внешней. Для чего ищем две пары соседних вершин, по одной на каждой из оболочек, таких, чтобы образованный ими четырёхугольник не пересекался ни с одной из этих оболочек, и соответственно заменяем образуемые этими парами рёбра на рёбра, являющиеся другой парой сторон четырёхугольника. Если на первом этапе остались 1-2 внутренние точки, то просто присоединяем их к внутренней оболочке так, чтобы не получить самопересечения.

    В итоге получаем несамопересекающийся многоугольник. Обходим его в любом направлении от любой из вершин - полученный список и есть требуемый ответ.
    Ответ написан
    Комментировать
  • Почему выдает ошибку literal does not match format string при добавлении даты?

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

    Используй явное форматирование:
    INSERT INTO people (last_name, first_name, sex, birthday)
    VALUES ('Иванов', 'Иван', 'm', TO_DATE('1999-04-04', 'YYYY-MM-DD'));


    DEMO
    Ответ написан
    Комментировать
  • Почему провайдеры не могут заблокировать VPN?

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

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

    Провайдер может блокировать трафик только в случае, когда он чётко знает, что данный трафик должен блокироваться. Блокировать всё подряд выглядящее подозрительным - путь, в конце которого можно найти лишение лицензии. А если и нет - то всё равно большую кучу проблем. Поэтому провайдер будет соблюдать именно букву, а не дух.
    Ответ написан
    Комментировать
  • Как работать с готовой базой данных sql?

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

    В комментариях дампа указано, что источником дампа послужил сервер MySQL версии 8.0.28. Поэтому восстанавливать следует на сервере MySQL, причём крайне желательно на версии не ниже 8.0.4. При восстановлении на более младшей версии или на частично совместимой MariaDB возможны проблемы при восстановлении, которые потребуют ручной корректировки дампа - а для этого нужны определённые знания, которых, скорее всего, нет.

    Для восстановления на локальном MySQL-сервере самое разумное - загрузить клиент командной строки и в нём:
    • создать новую БД (CREATE DATABASE databasename;) (в комментариях дампа указано имя history_futures_binance, так что разумно использовать именно его, если такой БД на сервере нет)
    • сделать её текущей (USE databasename)
    • дать команду на развёртывание дампаSOURCE 'x:\path\filename.sql'.

    Скорее всего, всё будет выполнено без ошибок, и в результате БД будет восстановлена. Если же при выполнении возникнут проблемы, будет выведено какое-то сообщение об ошибке - и в зависимости от него нужно будет предпринимать какие-то корректирующие действия.
    Ответ написан
    Комментировать
  • Как скопировать открытый файл vba скриптом?

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

    Ладно, повторю. У FileSystemObject нет метода Copy, он есть у объектов Folder и File. Следовательно,

    Set File = fso.GetFile(ThisWorkbook.Path & "\doc.docm")
    Set File = fso File.Copy("%Temp%\d6c.docm")

    PS. Что такое "открытый файл", где, кем и вообще почему он открытый - так и не понял.
    Ответ написан