Задать вопрос
Ответы пользователя по тегу MySQL
  • Как узнать позицию записи в базе?

    @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
    Ответ написан
    Комментировать
  • Насчет экспорта таблицы MySQL в Excel средствами PHP?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Выполняем SELECT .. INTO OUTFILE, полученный CSV прекрасно читается в Excel. Т.е. PHP выполняет указанный запрос, а потом, если надо, организует перемещение полученного CSV в нужное место.
    Ответ написан
  • Возможно ли одним запросом разрешить null во всех столбцах?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если речь об одной таблице - да, все поля могут быть откорректированы одним ALTER TABLE.
    Если о нескольких - то для каждой таблицы нужно будет выполнить отдельный запрос.
    Ответ написан
    Комментировать
  • Как узнать, имеет ли столбец unique?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Сведения об UNIQUE constraint (включая и PRIMARY KEY) могут быть получены запросами
    SELECT *
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_SCHEMA = DATABASE() /* либо 'database_name' */
      AND TABLE_NAME = 'table_name'
    
    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = 'table_name'


    The INFORMATION_SCHEMA KEY_COLUMN_USAGE Table
    The INFORMATION_SCHEMA COLUMNS Table
    Ответ написан
  • Какой запрос для выборки данных с двух таблиц в этом примере?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT categories.id, 
           categories.slug,  
           ct_ru.title title_ru,  
           ct_en.title title_en,  
           ct_de.title title_de
    FROM categories
    LEFT JOIN category_translations ct_ru ON category_translations.category_id=categories.id 
                                         AND category_translations.locale = 'ru'
    LEFT JOIN category_translations ct_en ON category_translations.category_id=categories.id 
                                         AND category_translations.locale = 'en'
    LEFT JOIN category_translations ct_de ON category_translations.category_id=categories.id 
                                         AND category_translations.locale = 'de';
    Ответ написан
    Комментировать
  • Как копировать данные из таблицы одной БД в другую БД по регламенту?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как это сделать в MYSQL Workbench

    Никак. Более того - никогда не делать ничего инструментом, для текущей задачи непредназначенным.

    Возможно, с помощью самого MYSQL

    Именно.
    Using the Event Scheduler
    Ответ написан
    Комментировать
  • Как в триггере сделать проверку, что изменение вызвал другой триггер?

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

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

    CREATE TRIGGER trigger_name
    EVENT ACTION ON table_name
    FOR EACH ROW
    BEGIN
        SET @trigger_name_table_name = CONCAT('executed, ', 'column_value=', NEW.column);
    -- trigger action
        SET @trigger_name_table_name = NULL;
    END;

    Если в теле триггера определены EXIT хэндлеры - они тоже должны выполнять соответствующие сбросы.
    Ответ написан
    Комментировать