• Как сравнить такие столбцы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    table1.id = SUBSTRING_INDEX(table2.id, '=', -1)
    Ответ написан
    Комментировать
  • Как разбить Date и Time в PostgreSQL запросе?

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

    SELECT '2022-04-01 09:23:45'::DATE, '2022-04-01 09:23:45'::TIME
    Ответ написан
    Комментировать
  • Какую длину может содержать условие выборки по ID?

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

    Есть. Ограничение на размер пакета.

    Кроме того, если список ID предварительно скинуть в temporary table primary key (id) engine=memory, то запрос при большом (~ более 10к значений) списке даже с учётом времени на создание и наполнение временной таблицы выполняется быстрее.
    Ответ написан
    Комментировать
  • Плоттер HP DJ T520 после настройки печати по сети (ввод IP-адреса), зависает и моргает экран. По USB работает. Что делать?

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

    Оказалось, проблема в прошивке (точнее, в самой флешке с прошивкой). Образ текущей прошивки сняли без проблем (кстати, рабочая прошивка и её копия - на флешке две копии прошивки, - частично не совпадают), найти типа рабочую прошивку в Инете - тоже без проблем... Но найти комбинацию прошивки и новой флешки, которая бы заработала нормально, нам не удалось (впрочем, врать не буду - не сильно упирались, перепробовали с десяток имевшихся под рукой флешек и угомонились), а стоимость ремонта у фирмачей оказалась неоправданно дорогая (да ещё и "везите к нам, будем смотреть"). Сейчас уже где-то с год работает подключенным к аппаратному сетевому принт-серверу (трёхпортовый старенький D-Link) по USB - по цене решения не сравнить.
    Ответ написан
    1 комментарий
  • Как вывести элемент, если нет связи 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 внутренние точки, то просто присоединяем их к внутренней оболочке так, чтобы не получить самопересечения.

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