Ответы пользователя по тегу MySQL
  • Почему не все emoji сохраняются?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    SET NAMES 'utf8mb4' выполнить после подключеия к базе, например
    Ответ написан
  • Как лучше связать таблицы для поиска по индексированным столбцам?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Читал, что при использовании JOIN индексирование бесполезно

    Чушь, ни читай такое больше

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

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Если формат или наор форматов известны, то проще всего будет написать helper
    function russianDate(int $timestamp) {
    	list($year, $month, $day) = explode("-", date("Y-n-j", $timestamp));
    	$monthsHandbook = [
    		1 => "января", 
    		2 => "февраля",
    		3 => "марта",
    		4 => "апреля",
    		5 => "мая",
    		6 => "июня",
    		7 => "июля",
    		8 => "августа",
    		9 => "сентября",
    		10 => "октября",
    		11 => "ноября",
    		12 => "декабря"
    	];
    	$monthName = $monthsHandbook[$month];
    	
    	return "{$day} {$monthName} {$year} года";
    }


    Если за простотой не гонишься, то устанавливай и используй Intl
    Ответ написан
  • Почему не записываются буквы при регистрации?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Кавычки вокруг $surname потерял при составлении SQL-запроса.
    https://habr.com/ru/post/662523/ - начни с этого, чтоб такого не было
    Ответ написан
    Комментировать
  • Как вы сохраняете пользователей авторизованных через социалки?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    В ту же таблицу. Добавляю туда поле {socialNetworkName}_id;
    username, если должен быть в системе уникальным, генерируется в процессе первого входа.
    password генерируется в процессе первого входа и высылается на почту.

    Таким образом, если пользователь залогинился через социалку впервые, то на почту ему приезжают реквизиты от аккаунта, которые он может потом использовать и при обычном логине.
    Ответ написан
    Комментировать
  • Как изменить определенные строки по id в mysql?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    ... вот ты прямо так на английском и пиши
    где = WHERE
    поле id = id
    от 1 до 10 000 = >=1 AND id <= 10000

    Теперь собирай всё вместе:
    WHERE id >=1 AND id <= 10000

    А теперь добавляй это условие к своему запросу:
    UPDATE table SET field=field*2 WHERE id >=1 AND id <= 10000
    Ответ написан
    4 комментария
  • Как получить последнее значение поля при группировке по другому полю?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Конкретно в таком примере (если есть гарантия, что utm-значения идут по возрастающей) будет работать и так:
    SELECT 
        `uid`,
        MAX(`utm`) AS 'utm' 
    FROM 
        `table`
    GROUP BY 
        `uid`


    Чтобы получить честную сортировку по id, понадобится GROUP_CONCAT
    SELECT 
        `uid`,
        LEFT(GROUP_CONCAT(`utm` ORDER BY id DESC), LOCATE(',', GROUP_CONCAT(`utm` ORDER BY id))-1) AS 'utm'
    FROM 
        `table`
    GROUP BY 
        `uid`


    PS Если обновишься до 10.3.3, то и LIMIT заработает и можно уже будет писать так:
    SELECT 
        `uid`,
        GROUP_CONCAT(`utm` ORDER BY id DESC LIMIT 1) AS 'utm'
    FROM 
        `table`
    GROUP BY 
        `uid`
    Ответ написан
    Комментировать
  • Как сделать IN если возможные значения записаны строкой?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT 
        `table_b`.* 
    FROM
        `table_b`
        JOIN `table_a` ON (FIND_IN_SET(`table_b`.`id`, `table_a`.`keys`) > 0)
    WHERE
        `table_a`.`id`='8'


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

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Просто получить дату последнего события:

    SELECT  
        `users`.*,
            (SELECT 
                `actions`.`date` 
            FROM 
                `actions` 
            WHERE 
                `actions`.`user`=`users`.`id` 
            ORDER BY 
                `date` DESC 
            LIMIT 1) AS 
        'last_action_date'
    FROM 
        `users` 
    WHERE 
        `id` = 1


    Получить всё событие целиком:
    SELECT  
        `users`.*,
            (SELECT 
                JSON_OBJECT(
                    'date', `actions`.`date`,
                    'action', `actions`.`action`
                )
            FROM 
                `actions` 
            WHERE 
                `actions`.`user`=`users`.`id` 
            ORDER BY 
                `date` DESC 
            LIMIT 1) AS 
        'last_action'
    FROM 
        `users` 
    WHERE 
        `id` = 1
    Ответ написан
  • Ошибка в коде базы данных, из-за которой не ставится плагин WP-Recall?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    У большого количества плагинов есть похожая проблема на php8.1
    Простое решение - откатить на 8.0.
    Сложное - написать автору плагина и ждать что он поправит его в ближайшем будущем
    Ответ написан
  • Как завести mysql (Ошибка 9 Bad file descriptor)?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Для начала попробуйте надёжно перезапустить:
    service mysql stop
    killall -KILL mysql mysqld_safe mysqld
    service mysql start


    Если не поможет, то приложите логи, которые в journalctl. Может мы углядим какую полезную информацию.
    И данные /var/log/mysqld.log тоже приложите.

    Ну и mysqld_safe попробуйте и уточните, заводится в safe mode или нет
    Ответ написан
  • Как получить итоговую сумму из двух таблиц?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Не описаны ситуации, когда нет информации о количестве продуктов на складе или, наоборот, на складе продукт есть, а вот в прейскуранте нет информации о его цене.

    Если исходить из предположения, что прейскурант первичен или данные всегда консистентны, то так:

    SELECT 
        `table_products`.`name` AS 'name',
        `table_warehouse_products`.`quantity` AS 'quantity',
        `table_products`.`price` AS 'price',
        `table_warehouse_products`.`quantity`*`table_products`.`price` AS 'total'
    FROM 
        `table_products`
        LEFT JOIN `table_warehouse_products` ON (`table_warehouse_products`.`product_id`=`table_products`.`id`)
    Ответ написан
    Комментировать
  • Как хранить множество данных для одного объекта в другой таблице?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    В таблицу с тикетам записывать id назначенного модератора
    В таблицу *_history (ну или *_log) записывать дату смены назначенного модератора и сопуствующую информацию - какой модератор был, какой стал, комментарии может какие. Это можно сделать как на уровне приложения, так и на уровне БД. У случае с БД можно использовать триггеры.

    Примерно такая структура
    CREATE TABLE `ticket` (
      `id` int unsigned NOT NULL AUTO_INCREMENT,
      `assignee_id` int DEFAULT NULL,
      `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `modified` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
      `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `body` text COLLATE utf8mb4_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    );
    
    CREATE TABLE `ticket_assignment_log` (
      `id` int unsigned NOT NULL AUTO_INCREMENT,
      `ticket_id` int unsigned NOT NULL,
      `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `old_assignee_id` int DEFAULT NULL,
      `new_assignee_id` int NOT NULL,
      PRIMARY KEY (`id`),
      KEY `i_ticket` (`ticket_id`),
      CONSTRAINT `fk_ticket` FOREIGN KEY (`ticket_id`) REFERENCES `ticket` (`id`) ON UPDATE CASCADE
    )
    Ответ написан
    5 комментариев
  • Как вывести нужную строку (оператор LIKE)?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT * FROM `table` WHERE FIND_IN_SET('28', `users_id`) > 0


    Если уж очень сильно хочется именно LIKE, то

    SELECT * FROM `table` WHERE (`users_id` LIKE '28,%' OR `users_id` LIKE '%,28,%' OR `users_id` LIKE '%,28')
    Ответ написан
    3 комментария
  • Как вырезать данные из столбца?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT REGEXP_REPLACE(
      'format|MP3||duration|01:42:46||year|2020||tracks|0||size|238 MB||torrent-mp3|[attachment=190:miami-cyber-nights-vol-1-2020.torrent]',
      '\\|tracks\\|[0-9]{1,}\\|',
      ''
    ) AS res;
    Ответ написан
    Комментировать
  • Group by. Как отфильтровать запрос?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT 
        ## product_id
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`product_id`)
            ELSE (
                SELECT 
                    `product_id` 
                FROM 
                    `products` AS `product_id_sub` 
                WHERE 1
                    AND `product_id_sub`.`group_id`=`products`.`group_id`
                    AND `product_id_sub`.`quantity` > `product_id_sub`.`minimum`
                ORDER BY 
                    `product_id_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'product_id',
        
        ## name
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`name`)
            ELSE (
                SELECT 
                    `name` 
                FROM 
                    `products` AS `name_sub` 
                WHERE 1
                    AND `name_sub`.`group_id`=`products`.`group_id`
                    AND `name_sub`.`quantity` > `name_sub`.`minimum`
                ORDER BY 
                    `name_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'name',
        
        ## quantity       
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`quantity`)
            ELSE (
                SELECT 
                    `quantity` 
                FROM 
                    `products` AS `quantity_sub` 
                WHERE 1
                    AND `quantity_sub`.`group_id`=`products`.`group_id`
                    AND `quantity_sub`.`quantity` > `quantity_sub`.`minimum`
                ORDER BY 
                    `quantity_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'quantity',
        
        ## minimum       
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`minimum`)
            ELSE (
                SELECT 
                    `minimum` 
                FROM 
                    `products` AS `minimum_sub` 
                WHERE 1
                    AND `minimum_sub`.`group_id`=`products`.`group_id`
                    AND `minimum_sub`.`quantity` > `minimum_sub`.`minimum`
                ORDER BY 
                    `minimum_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'minimum',
        
        ## group_id
        `group_id`    
    FROM `products`
    GROUP BY `group_id`


    Если устроит результат в виде JSON, то можно сократить количество подзапросов:
    SELECT 
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN JSON_OBJECT(
                'product_id', ANY_VALUE(`products`.`product_id`),
                'name', ANY_VALUE(`products`.`name`),
                'quantity', ANY_VALUE(`products`.`quantity`),
                'minimum', ANY_VALUE(`products`.`minimum`),
                'name', `products`.`group_id`
            )
            ELSE (
                SELECT 
                    JSON_OBJECT(
                        'product_id', `product_with_required_quantity`.`product_id`,
                        'name', `product_with_required_quantity`.`name`,
                        'quantity', `product_with_required_quantity`.`quantity`,
                        'minimum', `product_with_required_quantity`.`minimum`,
                        'name', `product_with_required_quantity`.`group_id`
                    )
                FROM 
                    `products` AS `product_with_required_quantity` 
                WHERE 1
                    AND `product_with_required_quantity`.`group_id`=`products`.`group_id`
                    AND `product_with_required_quantity`.`quantity` > `product_with_required_quantity`.`minimum`
                ORDER BY 
                    `product_with_required_quantity`.`minimum` DESC
                LIMIT 1
            )
        END AS 'product'  
    FROM `products`
    GROUP BY `group_id`


    PS В обоих запросах логика для не указанных чётко случаев следующая:
    1. Если нет ни одного записи с quantity>minimum, то пишем NULL
    2. Если больше чем одной записи с quantity>minimum, то выбираем запись с наибольшим quantity и пишем её данные
    Ответ написан
    Комментировать
  • Взять рандомную строку с удалением?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Ваш запрос похож на попытку удаления случайной строки из базы.
    Это действительно можно сделать одним запросом.
    Вот он:
    DELETE FROM `cat_product` WHERE `id` IN (SELECT `inner`.`id` FROM(
        SELECT  `cat_product`.`id` FROM `cat_product` ORDER BY RAND() LIMIT 1
    ) as `inner`)


    Если это не то чего вы хотели, то, пожалуйста, чётко сформулируйте в тексте вопроса желаемый результат. Максимально подробно.
    Ответ написан
    1 комментарий
  • Как сделать регистронезависимый поиск по longblob?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Поля данных BLOB/LONGBLOB вообще для хранения бинарных данных, а не для хранения текста, по которому может идти поиск.
    Если нужен поиск, то сделайте тип поля TEXT/LONGTEXT.

    Далее, что подразумевается под поиском?
    Есть в MySQL и LIKE, и REGEXP, и MATCH ... AGAINST

    Если речь о LIKE или MATCH ... AGAINST, то достаточно будет задать кодировку utf8_general_ci, да.
    Если говорим о REGEXP, то надо будет искомую строку в нижний регистр переводить. Например, с помощью LOWER()
    Ответ написан
    4 комментария
  • Как объединить 2 записи в одну по признаку?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT 
        ANY_VALUE(id) AS 'id',
        office_id, 
        IF(
            POSITION(',' IN GROUP_CONCAT(employee_id))=0, 
            GROUP_CONCAT(employee_id), 
            SUBSTR(GROUP_CONCAT(employee_id), 1, POSITION(',' IN GROUP_CONCAT(employee_id))-1)
        ) AS 'employee_id_first',
        IF(
            POSITION(',' IN GROUP_CONCAT(employee_id))=0, 
            NULL, 
            SUBSTR(
                RIGHT(GROUP_CONCAT(employee_id), LENGTH(GROUP_CONCAT(employee_id))-POSITION(',' IN GROUP_CONCAT(employee_id))),
                1,
                POSITION(',' IN RIGHT(GROUP_CONCAT(employee_id), LENGTH(GROUP_CONCAT(employee_id))-POSITION(',' IN GROUP_CONCAT(employee_id))))-1
            )
        ) AS 'employee_id_second'
    FROM 
        t
    GROUP BY
        office_id
    Ответ написан
    Комментировать
  • Как добавлять свои аватар пользователям сайта через mysql в phpmyadmin?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Для превращения картинки в код можно воспользоваться онлайн-сервисами. Например, вот: https://www.base64-image.de/
    Дальше этот код можно положить в базу
    Ответ написан
    Комментировать