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

    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/
    Дальше этот код можно положить в базу
    Ответ написан
    Комментировать
  • Как в Sql получить связь один ко многим, где многие будут сразу массивом?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    IF(COUNT(`spots_comments`.`id`) = 0, '[]', CONCAT(
        '[', 
        GROUP_CONCAT(JSON_OBJECT(
            'id', `spots_comments`.`id`,
            'created', `spots_comments`.`created`,
            'current', `spots_comments`.`text`,
        ) ORDER BY `spots_comments`.`created` DESC),
        ']'
    )) AS 'lastComments'
    Ответ написан
    Комментировать
  • Каким образом можно хранить массивы в ячейках в таблице?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Если вы хотите одним запросом вытаскивать, то JSON_ARRAYAGG вам в помощь.
    А так логика верная, только не все images вытаскивайте, а те, которые относятся к вашим постам.
    Ответ написан
    6 комментариев
  • Как проверить данные для авторизации через MySQL?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    mysqli_query возвращает false если во время выполнения запроса произошла ошибка. Поэтому, если вы уж пишете в таком стиле, то извольте проверять, что во время выполнения запроса ошибки не произошло. Примерно так:
    $checkUser = mysqli_query($connect, "SELECT * FROM `users` WHERE `email` == '$email' AND `password` == '$password'");
    if ($checkUser  === false) {
        die(mysqli_error($connect));
    }


    После того как вы добавите в код проверку, вы увидите что система ругается на некорректный синтаксис SQL-запроса. Конкретно в вашем случае это использование "==" для сравнения. В MySQL используется одинарное "=" для сравнения.
    После того как вы исправите эту ошибку, код ваш заработает, но он будет очень небезопасным.
    Для того чтобы подставлять значения из php-перемнных в SQL-запрос, используйте подготовленные выражения.

    Более подробно расписано почему не стоит использовать mysqli_num_rows и как пользоваться подготовленными выражениями (информация была скопирована отсюда):

    Это очень хороший вопрос.
    Ответ на него - никак не использовать.

    Да, в mysqli действительно есть специальная функция, которая может сказать, какое количество строк вернул запрос SELECT.
    Традиционно употребляется в двух случаях:

    а) когда это не нужно
    б) когда приводит к катастрофическим последствиям

    Первый вариант - это когда мы хотим узнать, вернул ли запрос хоть какие-то данные, или нет. Но на этот случай у нас есть сами данные. Зачем отдельно запрашивать их количество, если мы все равно будем эти данные получать в переменную, которую потом и можно будет использовать чтобы узнать, вернул ли запрос что-нибудь или нет.

    Второй вариант - если эта функция используется чтобы посчитать, сколько строк лежит в БД. В таком варианте это будет откровенное вредительство, поскольку данных может быть очень много, и все эти данные БД должна сначала получить у себя, а потом отправить в РНР. Заняв всю доступную память или даже вызвав фатальную ошибку нехватки памяти.

    Правильным решением этой задачи будет сделать запрос вида SELECT COUNT(*) FROM .... В этом случае БД сама внутри себя посчитает количество строк (очень быстро) и вернёт только одно число, которое не занимает оперативную память вообще.

    Вот и получается, что функция mysqli_num_rows() является либо вредной, либо бесполезной

    В данном случае надо сначала получить записи из БД
    // БЕЗОПАСНО выполняем запрос
    $stmt = $link->prepare("SELECT * FROM comments WHERE art_id = ?");
    $stmt->bind_param("s", $note_id);
    $stmt->execute();
    // получаем данные
    $result = $stmt->get_result();
    $comments = $result->fetch_all(MYSQLI_ASSOC);


    А после этого уже их выводить
    <?php if ($comments): ?>
        <?php foreach ($comments as $row): ?>
             <?=$row['comment']?><br>
        <?php endforeach ?>
    <?php else: ?>
        Эту запись еще никто не комментировал
    <?php endif ?>


    Как видно, никакой mysqli_num_rows нам не понадобилось
    Ответ написан
    7 комментариев
  • Как удалить строку из 2-х таблиц одним запросом?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    DELETE 
        A,
        B
    FROM 
        table_1 A
        LEFT JOIN table_2 B ON (A.Id= B.Id)
    WHERE 
        A.Id=80
    Ответ написан
    1 комментарий
  • Как максимально быстро взять последний элемент таблицы?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    100 мсек.
    Только dbname поменяйте на свой.

    SELECT
        `trade_history`.`uf_date`  
    FROM  
        `information_schema`.`tables` AS `informationSchemaTable`
        JOIN `dbname`.`trade_history` ON (`informationSchemaTable`.`auto_increment`-1=`trade_history`.`id`)
    WHERE 1
        AND `informationSchemaTable`.`table_schema` = 'dbname'
        AND `informationSchemaTable`.`table_name` = 'trade_history'
    Ответ написан
    Комментировать
  • Почему при пустом запросе возвращаются все строки?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Скобки поставить:
    SELECT 
        * 
    FROM 
        `injureds` 
    WHERE 
        `verified` = 1 AND 
        `deleted` IS NULL AND  (
            `id` LIKE CONCAT('%%') OR 
            `iname` LIKE CONCAT('%%')
        );
    Ответ написан
    Комментировать
  • Хочу сделать проверку на уникальность логина, но вы он постоянно выводит, что логин доступен. Почему?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    $connect = mysqli_connect("localhost", "root", "", "site");
    
    $sql = "SELECT * FROM `users` WHERE `login` = ?";
    $stmt = $connect ->prepare($sql);
    $stmt->bind_param("s", $_POST['username']);
    $stmt->execute();
    $stmt->store_result();
    
    if ($stmt->num_rows > 0) {
        echo 'This username is already taken';
    } else {
        echo 'This username is available';
    }
    Ответ написан
  • Как отследить изменения в БД?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Если на уровне БД, то используя триггеры можно отслеживать все изменения. Единственный минус - узнать, какой плагин отправил запрос не представляется возможным.

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

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Если у параметров есть только значения, то можно их сложить в одну строку. В дальнейшем это строку обратно в массив можно будет разобрать с помощью функции explode
    SELECT
        site_tmplvar_contentvalues.contentid,
        GROUP_CONCAT(site_tmplvar_contentvalues.value) AS 'values', -- все значения value складываем в одну строку. Разделитель по умолчанию - запятая, его можно поменять используя ключевое слово SEPARATOR
        site_content.id,
        site_content.pagetitle
    FROM
        site_content
    INNER JOIN site_tmplvar_contentvalues 
    ON site_content.id = site_tmplvar_contentvalues.contentid 
    AND site_content.parent = 17 
    AND site_tmplvar_contentvalues.tmplvarid IN (2, 13, 14)
    GROUP BY site_tmplvar_contentvalues.contentid -- добавляем группировку

    Если же у параметров есть еще и названия, то уже придется упаковывать данные в строку способом посложнее. Например, преобразовать в JSON. В таком случае на стороне PHP вам понадобится функция json_decode чтобы преобразовать эти данные обратно в массив или объект.
    Так как названия поле с ключом не указано, я предопожу то это site_tmplvar_contentvalues.key. Тогда запрос будет выглядеть так
    SELECT
        site_tmplvar_contentvalues.contentid,
        CONCAT('[', GROUP_CONCAT(JSON_OBJECT('key', site_tmplvar_contentvalues.key, 'value', site_tmplvar_contentvalues.value)), ']') AS 'values',
        site_content.id,
        site_content.pagetitle
    FROM
        site_content
    INNER JOIN site_tmplvar_contentvalues 
    ON site_content.id = site_tmplvar_contentvalues.contentid 
    AND site_content.parent = 17 
    AND site_tmplvar_contentvalues.tmplvarid IN (2, 13, 14)
    GROUP BY site_tmplvar_contentvalues.contentid -- добавляем группировку
    Ответ написан
  • Как реализуется поиск ключей по тексту?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Предположим что таблица с ключевыми словами выглядит так:
    5dcc30d1295d2668081499.png

    Тогда поиск можно реализовать так.
    SELECT 
    	*
    FROM 
    	`keyword`
    WHERE 
    	'Рядом с морем были расположены прекрасные горы' LIKE CONCAT('%', `keyword`.`value`, '%')

    Результат:
    5dcc32c1ed547879257354.png

    Что касается ресурсов - уточните ваши объемы.
    Ответ написан
    Комментировать
  • Какую архитектуру бд выбрать для приложения с большим количеством аккаунтов?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    100000 - это мелочи, плодить таблицы для каждого пользователя не надо.
    Ответ написан
    Комментировать
  • SQL "Help" INSERT INTO при добавление ID с AUTO_INCREMENT?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    INSERT INTO `users` VALUES
        (NULL, 'gfhjkl'),
        (NULL, 'dfghjkl')
    ;
    Ответ написан
    Комментировать
  • Как не добавлять одинаковые значения в БД + проверять одно поле?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    INSERT ... ON DUPLICATE KEY UPDATE для mysql
    Ответ написан
    Комментировать
  • Почему запросы выполняются медленно (большой объем данных)?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Настройки выставляли корректные? https://habr.com/ru/post/66684/
    Индексы вообще в оперативку вашего сервера помещаются?
    Ответ написан
  • Как правильно составить бд чтоб получить массив следующего вида (далее в деталях)?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Навскидку два варианта.
    Вариант #1, использовать в случае если наборы 'body' и 'ability' одинаковые для всех animal
    таблица animal, поля: id (int), title (varchar)
    таблица animal_body, поля: id (int), animal_id (int), head (int), paw (int)
    таблица animal_ability, поля: id (int), animal_id (int), run (int), jump (int)

    Вариант #2, использовать в случае если наборы 'body' и 'ability' разные для всех animal
    таблица animal, поля: id (int), title (varchar), body (json), ability (json)
    Ответ написан
  • Как обновить все ячейки у определённого id?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    В схеме INFORMATION_SCHEMA хранятся системные данные о таблицах, колонках и прочих потрохах.
    Данные оттуда помогут составить запрос.
    SELECT
    	CONCAT(
    		'UPDATE `121` SET `',
    		GROUP_CONCAT(`COLUMN_NAME` SEPARATOR '`=0, `'),
    		'`=0 WHERE `uid`=\'222\''
    	) AS 'updateQuery'
    FROM 
    	`INFORMATION_SCHEMA`.`COLUMNS` 
    WHERE 1
    	AND `TABLE_SCHEMA`='test' -- подставьте здесь название своей БД
    	AND `TABLE_NAME`='121'
    	AND `COLUMN_NAME` != 'uid'

    Результатом этого запроса будет как раз тот SQL-запрос, который ввам нужен.
    Примерно такой:
    UPDATE `121` SET `222`=0, `777`=0, `888`=0 WHERE `uid`='222'
    Ответ написан
    Комментировать