Ответы пользователя по тегу MySQL
  • Почему может тормозить простейший запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Для начала отформатируем запрос - чтобы хоть что-то было видно.
    SELECT vk_user_id, COUNT(1) AS score 
    FROM vk_scores 
    WHERE page_id IN (
        SELECT page_id 
        FROM blitz_tasks 
        WHERE stage = 1533
        ) 
    GROUP BY vk_user_id

    Учитываем, что blitz_tasks.page_id определён как NOT NULL UNIQUE (кстати, а почему не как PRIMARY KEY?), значит, запрос элементарно переписывается на INNER JOIN:
    SELECT vk_scores.vk_user_id, COUNT(*) AS score 
    FROM vk_scores 
    JOIN blitz_tasks USING (page_id)
    WHERE blitz_tasks.stage = 1533
    GROUP BY vk_scores.vk_user_id
    Ответ написан
  • Как создать строку date с автозаполнением при создании?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Reference Manual / ... / Keywords and Reserved Words

    Прочитать. Выучить. Никогда не использовать слова из списка в качестве имён объектов (таблиц, полей и пр.).
    Ответ написан
    Комментировать
  • Как посчитать количество дней подряд?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT SUM(CASE WHEN balance < 0 THEN 0 ELSE 1 END) OVER (ORDER BY date) grp
        FROM test
        )
    SELECT COUNT(*) - 1 max_cnt
    FROM cte
    GROUP BY grp
    ORDER BY 1 DESC LIMIT 1;


    fiddle (исходные украдены у Дмитрий).
    Ответ написан
    5 комментариев
  • Установка mysql - ошибка 1045(28000)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    - ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)


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

    Дословно сообщение означает: пользователя 'root'@'localhost' не получилось аутентифицировать с пустым паролем. Всё, не больше и не меньше. А по какой причине - пароль не пуст, такого юзера нет, или вообще это роль, а не юзер - сообщение установить не позволяет.

    Как фиксить - уже сказано в комментарии, который сделал Максим Припадчев.
    Ответ написан
    Комментировать
  • Что лучше, по одной или несколько записей при INSERT?

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

    PS. 40 записей в секунду - это в общем-то ни о чём..
    Ответ написан
    Комментировать
  • Почему очень долго выполняеться alter table в mysql 8 ubuntu?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. Вставьте в запрос явное создание индекса для работы внешнего ключа.
    2. Выполните действия тремя отдельными ALTER TABLE и выясните, какая именно операция занимает так много времени. Попробуйте явно указать для неё алгоритм выполнения.
    3. Спецификация CHAR(36) BINARY намекает, что там будет текстовое представление UUID. Да и имя поля намекает на то же самое. Но если так - то какой смысл в BINARY? чтобы потом надо было думать, что делать с регистрозависимостью? И вообще - почему бы не упаковать UUID в BINARY(16)? да, потребуется преобразование при вводе-выводе, зато ускорится обработка.
    4. ON UPDATE NO ACTION - это что, `billInc` (`uuid`) неуникальное, что ли? А сколько вообще записей в `billInc`?
    Ответ написан
    Комментировать
  • Как узнать позицию записи в базе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT COUNT(*) AS row_position
    FROM table_name t1
    JOIN table_name t2 ON t1.ordering_column >= t2.ordering_column
    WHERE t2.identifying_column = 'Объявление 7'
    Ответ написан
    Комментировать
  • Как создать порядковый номер для заказа конкретного заведения?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации.
    -- рабочая таблица
    CREATE TABLE orders (
      id INT AUTO_INCREMENT PRIMARY KEY,
      project_id INT,
      project_number INT
      );

    -- опорная таблица для генерации номеров в разрезе проектов
    CREATE TABLE generate_project_number (
      project_id INT,
      project_number INT AUTO_INCREMENT,
      PRIMARY KEY (project_id, project_number)
      ) ENGINE = MyISAM;

    -- триггер-генератор
    CREATE TRIGGER generate_project_number
    BEFORE INSERT ON orders
    FOR EACH ROW
    BEGIN
      -- вставить хапись в опорную таблицу для генерации номера
      INSERT INTO generate_project_number (project_id) VALUES (NEW.project_id);
      -- вставить сгенерированный номер в рабочую таблицу
      SET NEW.project_number = LAST_INSERT_ID();
      -- почистить опорную таблицу от лишних записей
      DELETE FROM generate_project_number 
      WHERE project_id = NEW.project_id
        AND project_number < NEW.project_number;
    END

    DEMO fiddle
    Ответ написан
    Комментировать
  • Как работать с двумя и более базами данных одновременно?

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

    PDO подключается не к базе данных, а к серверу. Просто в процессе подключения некоторая база сервера назначается текущей, и в случаях, когда в имени таблицы отсутствует алиас базы данных, считается, что данная таблица лежит в текущей БД. Кстати, в процессе работы текущая БД может быть и изменена - запросом USE new_default_database_name

    То есть после подключения к серверу доступны все БД этого сервера (ну в рамках имеющихся прав доступа, конечно). И, указывая полное имя таблиц, включающее имя БД, можно обращаться к любой доступной БД этого сервера, в т.ч. и к таблицам из разных БД в одном запросе.

    А если ещё подключить внешние таблицы (используя FEDERATED ENGINE) - то можно работать и с данными из баз на другом инстансе (сервере) MySQL.
    Ответ написан
    Комментировать
  • Как вычитать таблицу после JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    NOT IN в большинстве случаев - самая медленная реализация. Лучше использовать, в зависимости от объёма данных и наличия индексов, либо WHERE NOT EXISTS, либо LEFT JOIN WHERE IS NULL.

    SELECT * 
    FROM `table1` 
    JOIN `table2` ON `title`=`sometitle` 
    WHERE NOT EXISTS ( SELECT NULL
                       FROM table3
                       WHERE table1.id = table3.id )
    ORDER BY `date`


    SELECT * 
    FROM `table1` 
    JOIN `table2` ON `title`=`sometitle` 
    LEFT JOIN table3 ON table1.id = table3.id
    WHERE table3.id IS NULL
    ORDER BY `date`


    Что именно использовать - надо смотреть по построенному плану запроса и практическому сравнению производительности запросов.
    Ответ написан
    Комментировать
  • Связи в Mysql, как исправить ошибку 1215?

    @Akina
    Сетевой и системный админ, SQL-программист.
    К самим скриптам есть только одна претензия - в таблице photos отсутствует индекс по product_id, который необходим для создания внешнего ключа. После исправления этого косяка запрос на создание FOREIGN KEY выполняется без проблем.

    FIDDLE

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

    =========================

    Но это с формальной стороны. А вот логика - она лежит в глубоком ауте. И не понимает, почему идентификатор фотографии должен быть равен идентификатору продукта.
    Ответ написан
    Комментировать
  • Как сделать сортировку по 2 датам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если показанные исходные точны, то
    ORDER BY COALESCE(NULLIF(date2, ''), date1)
    Ответ написан
  • Как в таблицу sql с 4 столбцами вставить список значений, в котором может быть меньше 4х значений?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации, когда показанный список передаётся в запрос как один (многострочный) строковый литерал @list:

    INSERT INTO test (a,b,c,d)
    SELECT a,b,c,d
    FROM JSON_TABLE(
      CONCAT('[', REPLACE(REPLACE(@list, '(', '['), ')', ']'), ']'),
      '$[*]' COLUMNS (
        a INT PATH '$[0]',
        b INT PATH '$[1]',
        c INT PATH '$[2]',
        d INT PATH '$[3]'
        )                   
      ) jsontable

    DEMO fiddle

    Если данные на вставку лежат в файле - есть функция LOAD_FILE (не забыть GRANT FILE).
    Если данные передаются из языка/фреймворка - разумнее прямо там создать JSON и не париться с CONCAT и REPLACE.
    Если NULL не устраивает - добавить COALESCE.
    Ответ написан
    Комментировать
  • Когда сбрасывается global transaction isolation?

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

    Чтобы навсегда - нужно внести изменения в файл опций (my.ini) либо установить соотв. опцию в командной строке сервиса. Можно также использовать SET PERSIST (значение записывается в файл опций mysqld-auto.cnf).

    См. SET Syntax for Variable Assignment - там это описано более подробно.
    Ответ написан
    1 комментарий
  • Как отсортировать массив?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT name, `text`
    FROM product
    JOIN product_attribute USING (product_id)
    JOIN attribute_description USING (attribute_id)
    -- JOIN attribute USING (attribute_id)   -- таблица в запросе не нужна
    GROUP BY 1, 2
    HAVING COUNT(*) > 1;

    fiddle

    Если нужна именно сортировка как в эталоне - ну добавить ORDER BY MAX(attribute_id)

    Таблица attribute потребуется лишь в случае, если данные из неё нужны (например, в запрос добавится отбор по значению attribute_group_id).

    Если надо сравнивать атрибуты у более чем 2 товаров, то соотв. образом откорректировать условие пост-отбора. Например, для 3 товаров и атрибутов, имеющихся у всех трёх, это будет HAVING COUNT(*) = 3
    Ответ написан
  • Как упорядочить id записей в MySQL?

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

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

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

    В общем, надо тебе поле-нумератор? создай для этого дела ещё одно поле, просто числовое, не автоинкремент, и заполняй программно. А ещё лучше - организуй односвязный список, и нумеруй прямо в запросе на получение данных.
    Ответ написан
    Комментировать
  • Как исправить ошибку 1366 Incorrect string value?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Либо изменить кодировку поля, либо выполнить преобразование кодировки значения в запросе функцией CONVERT().
    Ответ написан
  • Как конвертировать уже существующие записи в другую кодировку?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Столбец name из кодировки utf8mb3_general_ci в utfmb4_general_ci

    Нужно потому что, в некоторых записях присутствуют некорректные символы.

    Это безнадёжное занятие - данные УЖЕ повреждены.

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

    Но в описанном случае можно выполнить изменение кодировки напрямую - UTF8MB3 есть подмножество UTF8MB4, и при смене кодировки опасности ошибки невалидного значения нет. DEMO fiddle. Впрочем, некорректные символы никуда не денутся.

    ===========================

    Столбец name из кодировки utf8mb3_general_ci в utfmb4_general_ci

    Это - не кодировки. Это COLLATION - набор правил сортировки символов.
    Ответ написан
  • Как в MySQL задать переменную и получить данные по ней?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT `id`, 
           (SELECT COUNT(*) FROM `table2` WHERE `id` = table1.id)  AS `count` 
    FROM `table1` 
    WHERE ....;
    Ответ написан
  • Как отсортировать в порядке определенном пользователем?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT 
      SQL_CALC_FOUND_ROWS wp_posts.ID
    FROM 
    ...
    GROUP BY 
      wp_posts.ID
    ORDER BY 
      MAX(bar_terms.term_id = 30) DESC -- , wp_posts.ID
    ...

    Вторичную сортировку раскомментировать (и, возможно, отредактировать), если bar_terms.term_id = 30 может соответствовать более одного wp_posts.ID
    Ответ написан
    Комментировать