Ответы пользователя по тегу MySQL
  • Как сформировать БД для запуска команд по расписанию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TABLE schedule ( schedule_id INT PRIMARY KEY,
                            start_time TIME,
                            task_id INT );

    В одной записи - одно время и одна задача. Никаких CSV-наборов.
    Если у задач есть отдельная таблица - то соответственно FOREIGN KEY в неё.
    Ответ написан
    1 комментарий
  • Как найти таблицу в нужной схеме MySQL?

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

    Получите соответствующее сообщение об ошибке.

    дошёл до такой функции

    Сотрите срочно. Существование таблицы (вообще или в определённой схеме) проверяется запросом в INFORMATION_SCHEMA.TABLES.

    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    -- WHERE TABLE_NAME = 'my_table_name'
    ;


    что если в другой схеме уже есть таблица с таким названием...

    Ну допустим есть, и что?
    Ответ написан
    Комментировать
  • Как создать правильно уточняющий запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Шаблон.

    SELECT product.id
    FROM product
    INNER JOIN product_property
    INNER JOIN property
    WHERE property.value IN ( {values list} )
    GROUP BY product.id
    HAVING COUNT(DISTINCT property.value) = {distinct values count}


    Условия связывания и дополнительные ограничения допишете самостоятельно.
    Ответ написан
  • Как импортировать большой JSON (18гб) в MySQL?

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

    Оптимальный - положить этот файл туда, куда может дотянуться MySQL. Импортировать, используя LOAD DATA INFILE, во временную таблицу. Несложным запросом распарсить в рабочие таблицы (как я понимаю, хоть весь файл и невалиден как JSON, но каждая отдельная строка файла есть JSON валидный). И прибить временную таблицу.

    На всё про всё три запроса. Если очень хочется, можно их выполнить и через php, конечно. Но я бы затолкал их в хранимую процедуру (особенно если задача импорта обновлённых данных будет регулярная) и вызывал её - тогда вообще один запрос CALL proc_name;.

    А можно и в один запрос уложиться, если использовать LOAD DATA INFILE с препроцессингом. Тогда и валидность JSON на строку неважна =- лишь бы формат данных в строке не плавал от одной строки к другой.

    А гонять 18 гектар с диска в PHP, а потом от PHP к MySQL - ну несерьёзно.

    PS. Загрузка с использованием LOAD DATA INFILE весьма нетребовательна к объёму оперативной памяти. И неважно, какого размера исходный файл.
    Ответ написан
    Комментировать
  • Как собрать данные в одну таблицу из двух?

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

    Нехорошая идея - портить данные. причём так, что ни повторить, ни откатиться. Куда как лучше создать третье поле
    ALTER TABLE related_products ADD COLUMN related_id INT;

    и уже в него добавить соотв. значения
    UPDATE related_products p
    JOIN another_table a ON p.related_sku = a.sku
    SET p.related_id = a.product_id
    WHERE p.related_id IS NULL

    WHERE нужен на случай повторных запусков второго запроса - вдруг не все соответствия будут получены из-за опечаток, различного написания и пр.
    Ответ написан
    Комментировать
  • Как вывести строчку в mysql workbench?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В MySQL в выходной поток может писАть только запрос SELECT. Без вариантов. Формально - также это могут делать встроенные макросы (например, SHOW) - но всё равно все они есть спрятанный в недрах кода SELECT.

    Триггер выполняется в рамках выполнения запроса INSERT/UPDATE/DELETE, т.е. запроса, для которого запись в выходной поток не разрешена. Соответственно из триггера никакую строку никуда вывести нельзя.
    Ответ написан
    2 комментария
  • Ошибка 1055 в MySQL означает что выбираемые значения должны быть и в GROUP BY и в SELECT одновременно?

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

    В данном случае Вы выбираете p.name, которого нет в ->groupBy('p.user') и которое не есть аргумент агрегатки. Добавьте его в выражение группировки, ->groupBy('p.user, p.name') (а если оно уникально в пределах одного p.user, то хватит и ->groupBy('p.name')).
    Ответ написан
    Комментировать
  • Как вывести список клиентов с непрерывной историей за год?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT ID_client
    FROM Transactions_info
    WHERE date_new BETWEEN @first_day_of_period
                       AND @last_day_of_period
    GROUP BY ID_client
    HAVING COUNT(DISTINCT date_new) = DATEDIFF(@last_day_of_period, @first_day_of_period) + 1
    Ответ написан
    6 комментариев
  • Правильный синтаксис при заполнении графы в таблице в соотношении из другой?

    @Akina
    Сетевой и системный админ, SQL-программист.
    UPDATE posts p
    JOIN communitiesusers cu USING (userid)
    SET p.communityid = cu.communityid 
    WHERE p.communityid IS NULL; -- или, может быть, p.communityid = ''
    Ответ написан
    1 комментарий
  • Sequelize - Как исправить ошибку (errno: 150 "Foreign key constraint is incorrectly formed)?

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

    Либо добавляйте столбцы внешнего ключа позже с различными миграциями (только для добавления столбца).
    Ответ написан
    Комментировать
  • Как сместить значение поля position на +1?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE PROCEDURE move_rows ( IN position_move_from INT,
                                 IN position_move_to INT )
    UPDATE test 
    SET pos = CASE WHEN id = position_move_to
                   THEN position_move_from
                   ELSE pos + SIGN(position_move_to - position_move_from)
                   END
    WHERE id BETWEEN LEAST(position_move_from, position_move_to)
                 AND GREATEST(position_move_from, position_move_to)
    ORDER BY id = position_move_to;


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

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

    Да, есть. The FEDERATED Storage Engine.

    Как это сделать на PHP?

    На первом сервере выполнить SELECT .. INTO OUTFILE.
    Переместить полученный файл в место, доступное со второго сервера.
    На втором сервере выполнить LOAD DATA INFILE.
    Ответ написан
    Комментировать
  • Почему в phpmyadmin название таблиц не отображается с регистром букв?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Регистрозависимость имён таблиц в MySQL определяется значением системной переменной lower_case_table_names. См. Identifier Case Sensitivity.

    Что же касается отображения имён в phpmyadmin - то это вопросы к нему, а не к MySQL. Можно попробовать выяснить экспериментально, как он реагирует на изменение значения указанной переменной, а также на явное квотирование имён бэктиками.
    Ответ написан
    3 комментария
  • Можно ли написать sql запрос на вывода последнего элемента?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT DISTINCT
           FIRST_VALUE(column_1) OVER (ORDER BY column_1 IS NULL, id DESC) column_1,
           FIRST_VALUE(column_2) OVER (ORDER BY column_2 IS NULL, id DESC) column_2
    FROM test;

    Если в "пустых" полях не NULL, а пустые строки, то соответственно
    SELECT DISTINCT
           FIRST_VALUE(column_1) OVER (ORDER BY column_1 = ' ', id DESC) column_1,
           FIRST_VALUE(column_2) OVER (ORDER BY column_2 = ' ', id DESC) column_2
    FROM test;

    fiddle

    Требуется MySQL версии 8+.
    Ответ написан
    Комментировать
  • Как удалить строку из 2-х таблиц одним запросом?

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

    Полагаете, что запись с указанным ID существует.

    Если в table_1 такой записи нет - никаких удалений не будет, даже если во второй таблице есть такие записи.

    В общем случае для решения задачи одним запросом необходим FULL JOIN. Но увы, MySQL его не поддерживает. А потому в общем случае задача нерешаема.
    Ответ написан
    Комментировать
  • Как исправить ошибку индекса PRIMARY базы данных mysql bitrix24?

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

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

    Факт 2

    Я перенёс портал из облака в коробку


    Итого

    Факты свидетельствуют о том, что перенос был выполнен некорректно. Для исправления - удалите поле id, а затем создайте первичный индекс с указанными тремя полями.

    Для проверки - предварительно подключитесь к старой версии таблицы и проверьте, действительно ли в ней отсутствует автоинкрементное поле по фамилии id. А в качестве совсем бреда - сравните, какая СУБД (включая точную версию) на старом и на новом месте.
    Ответ написан
    Комментировать
  • Ошибка в mysql таблица не может быть создана в зарезервированном табличном пространстве mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    mysql - это служебная БД. В ней как бы нежелательно создавать пользовательские таблицы.

    Если Вы хотите создать копию таблицы, делайте импорт в рабочую/временную базу данных. При этом убедитесь, что в дампе нет указания создавать таблицу именно в базе mysql (или явно отключите это при создании дампа).
    Ответ написан
    1 комментарий
  • Как выбрать ограниченное количество записей разного типа?

    @Akina
    Сетевой и системный админ, SQL-программист.
    3 эконома, 14 комфорта, 9 бизнеса, 4 премиум.


    Итого 3+14+9+4=30.

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

    Эконом - 1,2,3,31,32,33,61,62,63...
    Комфорт - 4,5,..,16,17,34,35,...
    Бизнес - 18,19,..25,26,48,49,...
    Премиум - 27,28,29,30,57,58,...

    И теперь сортируем при пагинации по этому номеру.

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

    PS. Но вообще-то клиент, увидев на странице дикие скачки цен, и прыжки вверх-вниз между страницами, скорее всего закроет этот бред, чтобы мозг не поломался.
    Ответ написан
    Комментировать
  • Как выполнить backup базы данных mysql запросом?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Очень теоретически можно организовать бэкап БД "одним запросом". И это будет запрос
    CALL stored_procedure(@datatbase_name);
    А вот в хранимой процедуре будет дофига запросов. Нужно будет из INFORMATION_SCHEMA получить список всех имеющихся в БД объектов и организовать копирование информации во внешний файл (причём для каждой таблицы придётся делать два файла - один со структурой, второй с данными). А ещё надо не забыть про процедуры, функции, триггеры... в общем, задачка весьма нетривиальная. Лучше даже не начинать.
    Ответ написан
    Комментировать
  • Как получить по лимиту данные из одной таблицы по разным критериям?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY RAND()) rn
                  FROM ...
                  WHERE ID IN (1, 2, ..100) )
    SELECT *
    FROM cte
    WHERE rn <= 5
    Ответ написан
    2 комментария