Задать вопрос
Ответы пользователя по тегу MySQL
  • MySQL PDO, Почему все значения при выборке типа string?

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

    То есть какие-то дополнительные преобразования, изменяющие тип данных, выполняет PHP уже после того, как он получил ответ от MySQL. Или не PHP, а коннектор, который PHP использует для доступа к MySQL. Но в любом случае это происходит уже на стороне клиента.

    Предположу, что эмуляция - процесс двусторонний. То есть не только на пути "туда", но и на обратном пути. Что при дополнительной обработке, которую требует настройка PDO::ATTR_EMULATE_PREPARES => true, корёжит тип данных.

    На всякий случай проверьте, не вызывает ли изменение этого флага корректировки других флагов. В частности, PDO::ATTR_STRINGIFY_FETCHES.
    Ответ написан
  • Как составить ассоциацию squelize один к одному?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как составить ассоциацию squelize один к одному?

    В MySQL связи "один к одному" не существует в принципе. Точнее, такая связь нереализуема на изменяемом наборе данных. Неважно, напрямую или через какой-либо ORM, включая и Sequelize.

    Возможна только реализация связи "один к (ноль либо один)".
    Ответ написан
    Комментировать
  • Как сделать дополнительную выборку записей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH 
    cte AS (
        SELECT * , 
               ROW_NUMBER() OVER (ORDER BY `date` DESC, id DESC) rn, 
               DENSE_RANK() OVER (ORDER BY `date` DESC, id DESC) dr
        FROM `list` 
        WHERE user='1' 
        )
    SELECT *
    FROM cte
    WHERE dr <= (
        SELECT dr
        FROM cte
        WHERE rn = 25
        )

    Версия сервера: 5.6.51 - MySQL Community Server (GPL)

    SELECT *
    FROM `list`
    WHERE user='1' 
      AND `date` >= (
        SELECT `date`
        FROM 'list'
        WHERE user='1' 
        ORDER BY `date` DESC, id DESC LIMIT 24, 1
    )
    Ответ написан
    4 комментария
  • JSON_REMOVE меняет порядок ключей?

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

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

    Кстати, сразу понятно, что поле имеет текстовый тип данных, а не JSON. Иначе бы эффект изменения порядка ключей в текстовом представлении JSON давно бы вылез.

    Если такой порядок важен - следует использовать массив, а не объект.
    Ответ написан
  • Как пофиксить ошибку Incorrect TIMESTAMP value?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если значение поля с типом TIMESTAMP некорректно (а пустая строка - это некорректное значение) - надо заменить его на корректное.
    • Если поле NULLable - то например на NULL.
    • Если настройки допускают нулевую дату - то на `0000-00-00 00:00:00`.
    • Иначе - на некое предопределённое значение. В зависимости от смысла поля - либо в далёком прошлом, либо в столь же далёком будущем.
    Ответ написан
    Комментировать
  • Как сохранить порядок номеров в запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT * 
    FROM table 
    WHERE id IN (7, 8, 5, 4, 1)
    ORDER BY FIND_IN_SET(id, '7,8,5,4,1');
    Ответ написан
    Комментировать
  • Как объединить запросы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Два LEFT JOIN, условие связывания - по id и определённому значению типа.
    Ответ написан
    Комментировать
  • Можно ли сделать такое отношение таблиц?

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

    можно ли в промежуточную таблицу добавлять поле amount или это считается недопустимым?

    Количество в данном случае - атрибут именно связи, а не продукта и не материала. Посему поле количества в связывающей таблице не только допустимо, но и единственно правильно. При условии, что на комбинацию полей (product_id, material_id) наложено требование уникальности. Иначе должна существовать ещё одна таблица, которая ссылается на связующую таблицу и содержит поле количества.
    Ответ написан
    Комментировать
  • Как выбрать последнюю запись с group by?

    @Akina
    Сетевой и системный админ, SQL-программист.
    А решение было близко... раз нужны данные с разных уровней группировки, то либо вертеть подзапросы/CTE, либо использовать оконные функции. Как по мне, второе проще.
    SELECT DISTINCT
           product_id,
           size,
           SUM(orders) OVER (PARTITION BY product_id, warehouse_id, size) AS orders,
           FIRST_VALUE(stocks) OVER (PARTITION BY product_id, warehouse_id, size 
                                     ORDER BY `date` DESC) AS stocks,
           warehouse_id
    FROM stats
    WHERE DATE(`date`) >= '2023-09-01' 
      AND DATE(`date`) <= '2023-09-04';

    fiddle
    Ответ написан
  • Как построить дерево одним запросом c сортировкой по родителю?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как-то так:
    WITH RECURSIVE
    cte AS (
        SELECT *, LPAD(id, 10, '0') path
        FROM comments
        WHERE parent_id = 0
      UNION ALL
        SELECT comments.*, CONCAT(cte.path, LPAD(comments.id, 10, '0'))
        FROM comments
        JOIN cte ON cte.id = comments.parent_id
    )
    SELECT id, parent_id, content
    FROM cte
    ORDER BY path;

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

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

    И я даже теоретически не могу придумать, как бы хоть какое программное обеспечение могло вывернуться в подобной ситуации. Без катастрофической потери производительности...
    Ответ написан
    Комментировать
  • Как получать данные из формы на сайте в разные таблицы БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    При добавлении набора данных в связанные таблицы (а по большому счёту - вообще всегда) следует забыть о существовании INSERT .. VALUES и пользоваться исключительно INSERT .. SELECT. Первый запрос вставляет запись в основную таблицу, второй вставляет в зависимую, получая необходимое для связывания значение из основной по известным критериям отбора (по только что вставленным значениям, либо, в случае MySQL, из LAST_INSERT_ID).
    Ответ написан
    Комментировать
  • Почему выдает ошибку создание триггера?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TRIGGER fff
    BEFORE INSERT ON stats
    FOR EACH ROW
       SET NEW.column11 = (NEW.column1 + NEW.column2 + NEW.column3 + NEW.column4 + NEW.column5 + NEW.column6 + NEW.column7 + NEW.column8 + NEW.column9 + NEW.column10) / 10;

    или
    DELIMITER ;;
    
    CREATE TRIGGER fff
    BEFORE INSERT ON stats
    FOR EACH ROW 
    BEGIN
       SET NEW.column11 = (NEW.column1 + NEW.column2 + NEW.column3 + NEW.column4 + NEW.column5 + NEW.column6 + NEW.column7 + NEW.column8 + NEW.column9 + NEW.column10) / 10;
    END;
    ;;
    
    DELIMITER ;
    Ответ написан
    Комментировать
  • Как установить максимальное количество строк в таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Демонстрация метода замены вставки на обновление: fiddle.
    Ответ написан
    Комментировать
  • Как исправить долгое выполнение запросов на большой таблице?

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

    В качестве решения предлагаю изменить тип поля на TEXT и добавить CHECK, а также индекс по значению.

    CREATE TABLE test (
        id INT PRIMARY KEY,
        data TEXT CHECK (JSON_VALID(data)), 
        INDEX idx_data (data(100))   -- подогнать до разумного
    );

    DEMO (см. время выполнения запросов).
    Ответ написан
    Комментировать
  • Влияет ли различные кодировки таблиц на производительность MySQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    если в базе mysql (версия 5.7) часть таблиц в utf8mb4_general_ci, а другая в utf8_general_ci

    :facepalm: Это не кодировки! Это COLLATION - набор правил для сравнения строковых значений.

    Хотя справедливости ради следует сказать, что возможные COLLATION определяются использованным CHARACTER SET. А для показанных значений они различны - utf8mb4_general_ci указывает на UTF8MB4, а utf8_general_ci на UTF8, который для этой версии СУБД является алиасом UTF8MB3.

    Влияет ли это как-то на производительность mysql?

    Если выполняется сравнение строковых значений (либо иная обработка таких значений в пределах одного выражения) с указанными CHARSET/COLLATION - несомненно, поскольку перед сравнением как минимум одно из значений должно подвергнуться конвертированию CHARSET, а это ресурсы.

    Если нет - то на производительность именно СУБД это влияет слабо. Заметное влияние будет при прогреве кэшей, а также в случае ну очень объёмных таблиц.

    Плюс гарантированное преобразование финального набора записей при несовпадении CHARSET поля и клиентского соединения.
    Ответ написан
    2 комментария
  • Как отсортировать записи по условиям?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM tablename, 
    ORDER BY column3 = 'какое то условие' DESC,
             column2 = 'какое то условие' DESC,
             column1 = 'какое то условие' DESC

    Запрос предполагает, что columnX не содержит NULL.
    Ответ написан
    Комментировать
  • Как создать корректный SQL триггер?

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

    ??? Какое ещё "поле"? может, запись? ну так для этого существует INSERT ... ON DUPLICATE KEY UPDATE Statement.
    А триггеры - они для дела, а не для баловства..
    Ответ написан
    Комментировать
  • SQL Можно ли получить результат одним запросом, без subselect?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Например, так:
    SELECT iw.id
    FROM anything iw
    LEFT JOIN status_anything si ON iw.id = si.anything_id
    LEFT JOIN status s ON s.id = si.status_id
    WHERE s.datum BETWEEN '2023-03-01' AND '2023-05-01'
    GROUP BY 1
    HAVING MIN(s.datum) > '2022-03-01'
    Ответ написан
    3 комментария
  • Как заполнить таблицу в MySQL через файл?

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

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

    Во-вторых, хорошим тоном считается указывать не только таблицу назначения, но и конкретные поля. А если импортируемый файл содержит данные не для всех полей, или порядок полей в файле и таблице не совпадает, то указание полей становится просто-таки обязательным и необходимым.

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

    id у меня auto-increment, пробовала и NULL, и 0, и просто цифрами заполнять - ни в какую.

    Пункт "во-вторых" в полный рост.

    Ну и любопытно, где именно Вы пробовали и NULL, и 0, и просто цифрами заполнять - в показанном Вами запросе под это просто нет места.
    Ответ написан
    Комментировать