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

    @remzalp
    Программер чего попало на чем попало
    по первому:
    и countRent < 3

    а пишете в запросе "countRent = 3"... Попробуйте добавлять по одному дополнительному условию в where, пока не начнет фильтровать только нужное. Если совсем ничего не вернул - возвращайтесь на шаг и смотрите где проблема.

    Текущую дату можно подставлять с функцией NOW(), а можно вставлять текстом из языка программирования (вы же в программе это делаете на самом деле, скрипте или там сценарии командной строки?).

    Дальше - просто название модели получить бесполезно. Надо получать первичный ключ таблицы (id), его использовать в следующем UPDATE запросе. Если ключа нет, то Вам повезло - в будущем будет весело и интересно с дублирующимися данными.

    Дальше - вы ВСЕ найденные модели хотите пометить как busy? Может дописать в конце LIMIT 1?

    Итого первая задача выполнить два запроса:
    1. получение достаточного количества столбцов, чтобы однозначно идентифицировать найденную строку (id + model, model + address или по вкусу). Из результатов запроса выводим модель, уникальный признак строки сохраняем между запросами
    2. в UPDATE запросе подставляем уникальный признак строки в выражение WHERE

    второй:
    https://dev.mysql.com/doc/refman/8.0/en/insert-on-...

    третий:
    https://dev.mysql.com/doc/refman/8.0/en/date-and-t...

    если совсем плохо с английским - mysql.ru с древним мануалом, но на русском.

    //Для удобства отвечающих хорошо бы прикладывать минимальный дамп, который можно вставить в БД и покрутить запросы, заодно будет видно сразу все ошибки по созданию структуры таблицы.
    Ответ написан
  • Сложный запрос MySql: группировка и фильтрация в запросе?

    @remzalp
    Программер чего попало на чем попало
    имеет смысл сначала довести SQL запрос до нормального состояния, а потом уже переходить к апи.

    Итого - есть пользователи, есть собственность, есть транспорт.

    1. Есть определенная непонятность - если мы сгруппировали по юзеру, у него есть несколько объектов собственности во владении и несколько транспортных средств - сколько строк Вы хотите получить в итоге?
    SELECT user.*,  
       GROUP_CONCAT(DISTINCT property.name ORDER BY property.name ASC SEPARATOR ', ') AS propertys,
    ....
       GROUP BY user.identifier ;

    Это должно дать список собственности, но вот транспорт так легко не делается - там 3 поля, это уже на грани написания хранимой процедуры

    2. Достаточно выводить только venicle_plate при условии если:
    WHERE venicle_job is null AND (venicle_type is null or venicle_type='car')

    в этом случае group_concat справится.
    Навскидку, можно еще вложенными подзапросами сделать:

    SELECT id,
     (SELECT GROUP_CONCAT(DISTINCT name  ORDER BY name ASC SEPARATOR ', ') FROM owned_properties WHERE users.identifier = owned_properties.owner GROUP BY owned_properties.owner ) as property,
     (SELECT GROUP_CONCAT(DISTINCT plate ORDER BY plate ASC SEPARATOR ', ') FROM owned_vehicles  
    			WHERE job is null AND (type is null or type='car') AND 
    			users.identifier = owned_vehicles .owner GROUP BY owned_vehicles .owner ) as venicle
      FROM users;


    опять же, сильно похоже, что тут удобней будет документоориентированная noSQL база данных

    примера БД под рукой нет, чтобы запросы отладить, но с виду жизнеспособно.
    Ответ написан
  • Как правильно задать запрос?

    @remzalp
    Программер чего попало на чем попало
    (a = '888' OR b = '444') AND c <> '12'
    Ответ написан
    1 комментарий
  • Оптимизация поиска по БД?

    @remzalp
    Программер чего попало на чем попало
    В своё время неплохо ускорил процесс поиска Sphinx, у него другая организация индекса, поэтому скорость резко отличается. Если на сервере мощности достаточно, то можно попробовать.

    ну и базовая оптимизация - LIKE "%...%"работает в разы медленнее, чем LIKE "...%"
    Вы мало сказали про состав типичной строки в БД и по какой её части планируете искать.

    Если что, то запрос "explain select ...." полезная штука
    Ответ написан
    2 комментария
  • Как на сайт через PHP вставить значения из другой БД MySQL на другом сервере?

    @remzalp
    Программер чего попало на чем попало
    Вариант 1: просто коннектишься к удаленной БД, вместо localhost в настройках подключения пишешь IP сервера.
    Но с той стороны сервер БД должен быть настроен слушать не только localhost, а 0.0.0.0 или актуальный ип сервера. Плюс в настройках фаерволла разрешить доступ к серверу БД с ип первого сервера.

    Вариант 2: реализуешь на втором сервере на php какой-то примитивный api (google rest api). Пишешь скрипт, который на определенный запрос через веб генерирует запрос в БД, отдаёт результат в формате JSON.
    Из своего скрипта через curl или просто
    $obj = json_decode(file_get_contents("https://server2/api.php?id=$id"));

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

    @remzalp
    Программер чего попало на чем попало
    Скорей всего администратор не ставил пакет с заголовочными файлами для разработки.
    Конкретно в этом случае требуется libmysqlclient-dev, как он зовётся в дебиане/убунту

    Как обойти? скачать руками, разложить локально, править пути, но тут я не силён.
    Ответ написан
    Комментировать
  • Ошибка Row size too large?

    @remzalp
    Программер чего попало на чем попало
    Длина всей строки получается:
    id=4+last_access_time=4+34x255=8 678 байт.
    упёрлись в технические ограничения.

    Можно вылечить как советуют
    ALTER TABLE `user_settings` ROW_FORMAT=DYNAMIC;

    Ключевой вопрос - А ВАМ НАДО СТОЛЬКО ХРАНИТЬ ОДНОЙ ТАБЛИЦЕЙ?
    Исходя из чего выбиралась такая длина данных?
    varchar может быть использовать?
    Ответ написан
    4 комментария
  • Как исправить результат выборки из БД?

    @remzalp
    Программер чего попало на чем попало
    У меня идиотский вопрос - что мешает один раз нормализовать данные в БД, чтобы не городить костылей?
    Почему название валюты внезапно стало значением?
    Почему в поле для хранения числовых значений вообще сумел храниться текст???

    На данный момент ситуация видится мне такой:
    #define TRUE FALSE //счастливой отладки

    На предмет костыля для решения проблемы:
    if (!is_numeric($cryptocurrency_value)) continue;
    if (!is_numeric($cryptocurrency_time)) continue;

    и всё, если у нас нет даты или числа в значении валюты - мы просто пропускаем эту запись.
    Добавить в цикле как раз по точке обрыва кода.
    Ответ написан
    3 комментария
  • Как правильно написать SQL запрос с под-select'ом?

    @remzalp
    Программер чего попало на чем попало
    SELECT task_name, 
      (SELECT image_path FROM uploads 
           WHERE uploads.timestamp = tasks.task_created 
            LIMIT 1) as im_path
    FROM uploads


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

    @remzalp
    Программер чего попало на чем попало
    Изучите GROUP BY, который в случае с MySQL всё аккуратно отсортирует, сгруппирует, а за компанию и посчитает сумму.

    Не понимаю, откуда взялся и как работает getTreeSum(), мне кажется какой-то лишний оверкилл может происходить внутри.

    Дальше - допишите EXPLAIN перед своим запросом и покажите результат - это скажет, в каких местах всё плохо.

    Подозреваю, запрос должен делиться на 2 части - вывод идшников дочерних узлов вложенным подзапросом и SUMмма по полученному:
    WHERE id IN (select .... left_key >= левый_ключ_необходимого_узла AND right_key <= правый_ключ_необходимого_узла)
    Ответ написан
    Комментировать
  • Почему код грузит mysql?

    @remzalp
    Программер чего попало на чем попало
    1. $querystring - мне страшно даже думать про итоговый запрос. Изучите конструкцию "WHERE field_name IN (val1,val2,....)"
    2. WHERE `login`, ORDER BY `insearch` - индекс по этим полям создан?
    запрос вида
    EXPLAIN SELECT `account_id` FROM `accounts` WHERE `login` = 'any'
    даст немного инфы к размышлению
    3. $accounts[$i] что содержит? Может там многовато информации
    4. Весь цикл на самом деле можно свести к одному запросу
    SELECT `account_id` FROM `accounts` WHERE `login`IN(....)
    Ответ написан
    1 комментарий
  • Как изменить всю кодировку в mysqul phpmyadmin?

    @remzalp
    Программер чего попало на чем попало
    1. Запрос вам нагенерировал замечательных команд для изменения кодировки.
    ЗАПУСТИТЕ ИХ.

    2. Может быть имеет смысл на этапе подключения к БД явно указывать кодировку соединения? В коде подключения к БД сразу после connect.
    set names utf8;
    Ответ написан
    1 комментарий
  • Какие еще действия предпринять для увеличения скорости выборки в MySQL?

    @remzalp
    Программер чего попало на чем попало
    Фрагмент запроса "a.ID IN (ннн,нн)" уже выбирает максимально быстрым методом по первичному ключу всю необходимую информацию, которая дальше дофильтровывается.

    Дальше уже вопрос - а насколько много столбцов Вы получаете запросом, есть ли там лишние?
    Есть ли столбцы типа TEXT, Varchar, у которых переменная длина, что может немного понизить производительность в нкоторых операциях.

    Следующий вопрос - а не пора ли оптимизировать настройки сервера - кэш, память. Начиная с mysqltuner.com , заканчивая вдумчивым анализом манов и статистики использования.

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

    И еще для тестов без кэширования ребутить сервер не надо. Используйте:
    SELECT SQL_NO_CACHE a.ID FROM articles a WHERE ...
    Ответ написан
    Комментировать
  • Как посчитать количество элементов?

    @remzalp
    Программер чего попало на чем попало
    SELECT COUNT(*) FROM (
       SELECT ff_id FROM test ORDER BY date_added LIMIT 10 
    ) test_outer
    WHERE ff_id=2
    
    именование результирующей таблицы обязательно.
    Ответ написан
    Комментировать
  • Безопасно ли открывать порт mysql в мир?

    @remzalp
    Программер чего попало на чем попало
    Да, небезопасно, альтернативы
    1. поднять VPN, доступ к мускулю снаружи только по впн, не напрямую (резать в iptables)

    2. (сам использую) пускать разрабов с пробросом портов по ssh. Себе настроил путти (батник):
    putty.exe -ssh user@site.ru -L 3396:localhost:3306
    в итоге на компе любой удобный и привычный софт можно использовать, указывая в качестве сервера БД
    127.0.0.1:3396, со стороны сервера они выглядят как коннекты с localhost
    На сервере завести отдельного юзера с минимальнейшими правами - ему даже входить не обязательно в шелл, только до локального сокета достучаться, плюс настроить авторизацию по сертификату для полного удобства.

    дополнительный бонус - с использованием ключа "-C" будет еще и компрессия данных, что может приятно повлиять на скорость передачи хорошо сжимаемых данных.
    Ответ написан
    2 комментария
  • Как сделать ЧПУ без id?

    @remzalp
    Программер чего попало на чем попало
    Дополню D' Normalization
    1. Завести таблицу вида id, slug, причем slug char, будет чуть быстрее (индекс не забываем). А сама таблица с приличной вероятностью будет целиком попадать в кэш.

    Самый простой вариант запроса
    SELECT id, title, author FROM books WHERE id=(select id from slugs where slug='php-dlya-chajnikov')

    2. Добавить в рецепт sphinxsearch.com, ибо он резок как понос, но это план на очень далёкое будущее, хотя если на нем реализовать поиск по описаниям, то будет очень хорошо.
    Ответ написан
    1 комментарий