Ответы пользователя по тегу MySQL
  • Возможно ли задать приоритет обработки конкретным таблицам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Эти операции может, и приоритетны, но за пределами MySQL. Вот там и решайте эту проблему.

    В MySQL Community Server нет ничего подобного в принципе. А вот в Enterprise имеется MySQL Enterprise Thread Pool, умеющий приоритезировать соединения (не запросы).

    В принципе можно ещё покопаться в MySQL proxy и аналогичных. Может, и там что сыщется.
    Ответ написан
    1 комментарий
  • Как удалить в Mysql все записи кроме последнего т.е MAX(id)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    DELETE t1 
    FROM test t1
    JOIN test t2 ON t2.id > t1.id;

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=19cb29...
    Ответ написан
    Комментировать
  • Как правильно работать со временем в таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Работа с датой ускоряет или усложняет процесс, если ее заменить вбиванием цифр вручную по типу 15122021?
    Аналог 15 12 2021

    Серверу глубоко похрен. Главное - соблюдать допустимый формат. Любой из MySQL 8.0 Date and Time Literals. Просто помни, что "вбивание цифр вручную" - это прямой путь к опечаткам, а они чреваты боком...

    Как ее сделать авто добавляемой для каждого заказа и осуществлять после переборку по ним?

    И откуда ему взяться? ветром надует?
    А если есть вменяемый алгоритм формирования значения - то его следует запрограммировать. Если допустимо - то как DEFAULT в структуре таблицы, иначе в BEFORE INSERT триггере.
    Ответ написан
    2 комментария
  • Как обрабатывать несколько запросов одновременно через одно подключение python mysql.connector?

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

    При выполнении нескольких запросов одновременно (параллельно) каждый запрос должен выполняться в своём собственном соединении.

    MySQL в принципе не знает про параллельные запросы в одном соединении - пока выполнение запроса не завершится и не будет отдан результат, соединение просто не взаимодействует с потоком ввода.

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

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

    Можно. Но вот получить набор критериев для применения в WHERE IN - нельзя.

    В принципе задача в нынешнем виде (если не делать как нужно, что описано в ответе FanatPHP) имеет минимум пару решений.

    Можно изменить сепаратор на просто запятую, без пробела, и использовать FIND_IN_SET(). Но надо понимать, что при этом будет выполняться строковый неиндексированный поиск подстроки - то есть гарантированно медленно.

    Можно добавить скобки, превратив строковый список в JSON-массив, и распарсить его на отдельные элементы функцией JSON_TABLE(). Но и этот метод быстродействием не отличится.

    Так что срочно забывайте эту дурь с GROUP_CONCAT() и используйте нормальный JOIN.
    Ответ написан
  • Group by. Как отфильтровать запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    По показанным данным и тому, что удалось выудить из описания и комментариев, мне кажется, что достаточно для каждой группы вернуть одну запись с максимальным в группе значением quantity. Это делается запросом
    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY quantity DESC) rn
        FROM tablename
    )
    SELECT *
    FROM cte
    WHERE rn = 1;


    Запрос предполагает, что для всех записей группы значение minimum одинаково. Если это не так - использовать ORDER BY quantity>minimum DESC, quantity DESC.

    Запрос предполагает, что в группе нет дубликатов по quantity. Если это не так - вернётся случайный из дубликатов с максимальным значением поля. Если нужен определённый из них - расширить соотв. образом ORDER BY.

    Если версия MySQL старая и не поддерживает ни CTE, ни оконные функции - использовать эмуляцию ROW_NUMBER() на базе UDV в подзапросе.
    Ответ написан
    Комментировать
  • Запрос для получения уникальных значений и их количества?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT categoryId, COUNT(*) AS `count`
    FROM table
    GROUP BY categoryId
    Ответ написан
    Комментировать
  • Что такое instance и как это настроить?

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


    Вообще Instance - это экземпляр. В данном случае экземпляр MySQL-сервера.

    Скажем, в одной и той же операционной системе может работать несколько серверов MySQL - как одной и той же, так и разных версий. Только, чтобы не пересекаться по используемым ресурсам, они будут использовать разные номера портов и/или разные каналы. Вот эти серверы и есть Instances. Соответственно при подключении указываем нужный порт, и подключаемся к нужному в данный момент Instance. Обычно же в одной ОС работает только один сервер - тогда он является единственным Instance.

    PS. Операционка, в которой все они одновременно работают, тоже может быть Instance, но только уже OS instance, если она - одна из нескольких виртуализованных операционных систем, одновременно работающих на одном хосте в рамках одного VMM.

    как это настроить?

    Настройка MySQL-сервера на то, какие каналы (IP, named pipe, shared memory), а для IP - с какими настройками (номер порта), выполняется через конфигурационные файлы сервера. Где они, какие имеют имена, какие параметры следует устанавливать и прочее - читай в Reference Manual.
    Ответ написан
    Комментировать
  • Как можно с помощью регулярки изменить все значения в столбце?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В колонке есть записи
    100г
    200 г
    300гр
    400 гр
    500г.

    Как их можно привести к одному шаблону, number + 'г'?

    Если они ВСЕ в граммах, то
    UPDATE tablename
    SET columnname = CONCAT(columnname + 0, 'г');
    Ответ написан
    2 комментария
  • Как подставить алиас в sql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Приоритет запятой ниже приоритета JOIN. Поэтому запрос по факту такой:
    FROM adverts as a, 
         category as c, 
         ( category_advert as ca 
           LEFT JOIN advert_imgs as ai ON ai.main = 1 and ai.id_adv = a.id )

    Очевидно, что внутри скобок никакого a.id нет.

    Забудьте про возможность использовать запятую во FROM. Навсегда. Используйте вместо неё CROSS JOIN.
    Ответ написан
    6 комментариев
  • При sql запросе писать с кавычками или без?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1) Как безопаснее и правильней писать имя таблицы и базы с кавычками или без кавычек . Если с кавычками то с двойными или одинарными.


    В MySQL используется три разных типа кавычек.

    1. Прямая кавычка '

    Используется для обрамления литералов, требующих такого обрамления, а именно: строковые, даты-времени, JSON, компоненты имени учётной записи и пр. Подробнее см. Literal Values и Specifying Account Names

    2. Обратная кавычка `

    Используется для обрамления имён объектов (БД, таблиц, полей, имён функций/процедур и пр.).

    Если имя объекта не содержит нелегитимных символов (подробнее см. Schema Object Names), не является служебным или зарезервированным словом (см. Keywords and Reserved Words), использование обратной кавычки опционально, иначе обязательно.

    3. Двойная кавычка "

    Используется для обрамления строковых компонентов (имя, значение) для типа данных JSON (внутри строкового литерала с JSON-значением, ограниченного одинарными кавычками). Допускается использование вместо одинарной кавычки для обрамления литералов.

    При включённом ANSI_QUOTES в SQL Mode указанные использования отменяются, и двойная кавычка используется для обрамления имён объектов (т.е. дублирует использование обратной кавычки).

    ИТОГО с точки зрения безопасности:

    - имена объектов ВСЕГДА обрамлять ТОЛЬКО обратной кавычкой
    - литералы, требующие обрамления - обрамлять ТОЛЬКО одинарной кавычкой
    - двойную кавычку использовать ТОЛЬКО как символ в составе литерала (строкового, JSON)
    Ответ написан
    1 комментарий
  • Ошибка в транзакций mysql. как решить?

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

    UPDATE tablename
    SET balance = balance + CASE WHEN userid = @sender
                                 THEN -@amount
                                 ELSE @amount
                                 END
    WHERE userid IN (@sender, @receiver);
    Ответ написан
    1 комментарий
  • Можно ли сделать составной уникальный ключ "в обе стороны" (напр. 3 и 15 == 15 и 3)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Задача решается созданием вычисляемого поля. Один из вариантов:
    CREATE TABLE test (
        id_1 INT,
        id_2 INT,
        ids VARCHAR(255) AS (CONCAT(LEAST(id_1, id_2), ' ', GREATEST(id_1, id_2))) STORED,
        PRIMARY KEY(ids),
        CHECK (id_1 <> id_2)
    );

    DEMO

    В принципе, можно и триггером... но менее надёжно.
    Ответ написан
    8 комментариев
  • Как вставить в строки значение с увеличением числа в БД?

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

    Решение 1. Более простое, но может давать дубликаты в конкурентной среде.
    CREATE TRIGGER tr_name
    BEFORE INSERT
    ON articles
    FOR EACH ROW
    SET NEW.image = CONCAT('catalog/blog-image/', COALESCE((SELECT 1 + MAX(SUBSTRING_INDEX(image, '/', -1)) FROM articles), 1), '.jpg');

    DEMO

    Решение 2.Устойчиво в конкурентной среде.

    Создаётся опорная таблица генерируемых номеров:
    CREATE TABLE image_counter (id INT AUTO_INCREMENT PRIMARY KEY);

    Триггер использует таблицу для генерации:
    CREATE TRIGGER tr_name
    BEFORE INSERT
    ON articles
    FOR EACH ROW
    BEGIN
        INSERT INTO image_counter VALUES (DEFAULT);
        SET NEW.image = CONCAT('catalog/blog-image/', LAST_INSERT_ID(), '.jpg');
        DELETE FROM image_counter;
    END

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

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

    Регистрозависимость операций поиска/сравнения определяется применяемым COLLATION.
    LONGBLOB имеет по умолчанию binary collation (например, utf8mb4_bin) - поэтому сравнение выполняется бинарное.
    Для регистронезависимого текстового сравнения надо явно определить требуемый COLLATION в запросе. Типа
    WHERE column COLLATE utf8mb4_0900_ai_ci LIKE 'pattern'

    Если надо ещё и charset подкорректировать, то дополнительно использовать функцию CONVERT().
    Ответ написан
    4 комментария
  • Как сделать умный поиск по базе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    А если будем просто через LIKE то придет вот так (так не нужно): Иван, Ваня, Ивановы...

    Нет. Отбор записей и их сортировка - две совершенно независимые операции.
    SELECT word 
    FROM words 
    WHERE word LIKE '%$search%'
    ORDER BY LOCATE($search, word), word
    Ответ написан
    Комментировать
  • Поставить индексы на каждое поле?

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

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

    пока не понятно, какие индексы нужны, а какие нет.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT b.`id`, b.`date`, l.`path` 
    FROM `buy` b
    INNER JOIN `em` e ON b.`em_id` = e.`id`
    INNER JOIN `ls` l ON FIND_IN_SET(l.`id`, b.`ls_id`)

    PS. Хранение данных в CSV - это денормализация, дурной тон, и вообще кривой переулок, ведущий прямо на поле с граблями...
    Ответ написан
    2 комментария
  • Запрос MySql. Как составить выборку из первой таблицы по нескольким параметрам из второй?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT ft.*, pt.*
    FROM fruit_table ft
    JOIN param_table pt ON ft.id=pt.id_fruit
    JOIN ( SELECT id_fruit
           FROM param_table
           WHERE id_param IN (10, 20)
           GROUP BY 1
           HAVING COUNT(DISTINCT id_param) = 2 ) ptx ON pt.id_param = ptx.id_param
    Ответ написан
    2 комментария
  • Как изменить свойства колонки, не удаляя текущие значения?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Целевое поле - вычисляемое. Значит, фраза "не удаляя её значения" по отношению к нему не имеет смысла. Даже если это поле - хранимое, а не виртуальное.
    Ответ написан
    Комментировать