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

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT good,                      -- выбрать идентификатор товара
           amount * unit_price AS `sum` -- и потраченную на него сумму
    FROM Payments 
    ORDER BY `sum` DESC;                -- отсортировать по убыванию суммы
    Ответ написан
    Комментировать
  • Почему подключение к MySQL идет без пароля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Когда в консоли ввожу mysql, то выдается такая ошбика:

    ERROR 1045 (28000): Access denied for user 'ghjjj'@'localhost' (using password: NO)

    MySQL сам придумать учётку не может. Вариантов два:

    1. Вводя mysql, ты на самом деле запускаешь не исполняемый модуль CLI, а некий скрипт, который уже запускает CLI с некими параметрами. Ищи этот скрипт, разбирайся, откуда он взялся и что задаёт в опциях запуска.

    2. CLI берёт имя пользователя из файла установок (my.ini, секция [client]). Находи и исправляй.
    Ответ написан
    Комментировать
  • Как вывести из sql таблицы все строки с совпадающими значениями?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT a, b, c, COUNT(*) OVER (PARTITION BY a, c) cnt
        FROM table
    )
    SELECT a, b, c
    FROM cte 
    WHERE cnt > 1
    Ответ написан
    1 комментарий
  • Как оптимально сделать выборку из БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Применительно к данной конкретной задаче:
    • СУБД предназначена для хранения и обработки массивов данных.
    • ЯП предназначен для обеспечения пользовательского интерфейса этого процесса и управления им.


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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Но в mysql есть же json поля, что если построить нужное дерево в виде json

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

    Кстати, ковыряние JSON руками... либо JSON не более сотни байт, либо ни разу не развлечение (если ты не мазохист, конечно).
    Ответ написан
    Комментировать
  • Как узнать root пароль от mysql zabbix сгенерированный при установке?

    @Akina
    Сетевой и системный админ, SQL-программист.
    как узнать/сменить root mysql

    Узнать - никак, если не указано в документации.
    Сменить - How to Reset the Root Password, и лучше сразу Resetting the Root Password: Generic Instructions.
    Ответ написан
    3 комментария
  • Как увеличить скорость загрузки данных в Mysql?

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


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

    Если даунтайм недоступен или версии серверов различаются, но исходная база доступна, надо сделать бэкап структуры, и отдельно бэкап данных в формат CSV. Структуру поделить на две части - собственно таблицы и всё остальное. Затем восстановить таблицы, в них скопировать данные, затем наслоить все остальные объекты.

    Если же исходная база недоступна - то запускай развёртывание бэкапа и сиди-жди, другого пути нет.

    На другом форуме нашел решение, мол добавить эти значения:

    Эти значения критично зависят от железа хоста. И на твоём хосте запросто вместо ускорения можно поиметь изрядное замедление.

    Опять же - корректируя innodb_buffer_pool_size, нужно корректировать innodb_buffer_pool_chunk_size и/или innodb_buffer_pool_instances. И вообще - см. https://dev.mysql.com/doc/refman/5.7/en/innodb-buf... (перейди на справку для своей версии, если нужно).
    Ответ написан
    Комментировать
  • Как сделать ежесекундную обработку действий?

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

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

    Уровня БД либо отдельных объектов БД: данные - всё, кроме FILE; структура - CREATE TEMPORARY TABLES и (если используются хранимые объекты) EXECUTE.

    Ну а далее - плюс дополнительные необходимые права, в зависимости от кривизны структуры и работы с базой.
    Ответ написан
    Комментировать
  • Как удалить ненужные и добавить нужные кодировки MySQL8?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Во-первых, всё указанное - ни разу не кодировки. Это COLLATION - набор правил сравнения строковых значений.

    Во-вторых, убирать/удалять ничего не нужно. То, что не используется, ресурсов не потребляет.

    В третьих, добавление нужных кодировок и правил сравнения подробно описывается в документации:

    Adding a Character Set
    Adding a Collation to a Character Set

    Ну и вообще желательно изучить весь раздел Character Sets, Collations, Unicode.
    Ответ написан
    6 комментариев
  • PyMySQL не хочет принимать определенный запрос, в чем может быть проблема?

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

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

    CREATE TRIGGER setUUID 
    BEFORE INSERT ON users
    FOR EACH ROW 
    	SET NEW.uuid = COALESCE(NEW.uuid, UUID());
    Ответ написан
    1 комментарий
  • Что такое PRIMARY KEY, CONSTRAINT, FOREIGN KEY, REFERENCES, INSERT INTO и для чего они нужны?

    @Akina
    Сетевой и системный админ, SQL-программист.
    PRIMARY KEY - первичный ключ. Поле, комбинация полей либо выражение (последнее MySQL не поддерживает), которое не может быть NULL и не допускает дубликатов (уникально для каждой отдельной записи в пределах таблицы). Поддерживается путём создания соответствующего уникального индекса и наложением ограничения NOT NULL на все используемые в выражении поля. По факту - однозначно идентифицирует запись. Кроме того, в MySQL выражение первичного ключа является кластерным индексом. См. Индекс -> Уникальный индекс -> Первичный индекс.

    CONSTRAINT - ограничение. Правило, которое не допускает создания записи, для которой значение выражения ограничения имеет значения FALSE (можно TRUE или NULL).

    FOREIGN KEY - внешний ключ. Ограничение, которое требует, чтобы указанное выражение для текущей записи присутствовало среди значений указанного выражения референсной таблицы (допускается и внешний ключ на ту же таблицу). Точнее, чтобы такая проверка присутствия не возвращала FALSE (можно TRUE или NULL).

    REFERENCES - определяет референсную таблицу и референсное выражение.

    INSERT INTO - запрос, вставляющий новые записи в таблицу.
    Ответ написан
    Комментировать
  • Выбрать строку из БД по значениям связанной таблицы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT rule.id, rule.path, rule.content, rule.cat_id 
    FROM rule
    JOIN rule_options ON rule.id = rule_options.rule_id
    WHERE rule_options.option IN (4670, 5492)
    GROUP BY 1,2,3,4
    HAVING COUNT(DISTINCT rule_options.option) = 2;
    Ответ написан
    2 комментария
  • Как выбрать данные за два периода?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT name,
           SUM(CASE WHEN {date in period 1} 
                    THEN value 
                    ELSE 0 
                    END) AS sum_1,
           SUM(CASE WHEN {date in period 2} 
                    THEN value 
                    ELSE 0 
                    END) AS sum_2
    FROM table
    WHERE {date in period 1 or 2}
    GROUP BY name
    Ответ написан
    Комментировать
  • Почему может тормозить простейший запрос?

    @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`?
    Ответ написан
    Комментировать