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

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    У вас к кода бардак. Вы не понимаете что там происходит, мы тем более.
    Тем не менее:
    1) Вы используете слово "внести", что скорее всего $this->db->insert, а не $this->db->update
    2) Реализация $this->db не понятна, похоже что вы 5 раз переназначаете where и set для 5 запросов update, а выполнение самих запросов вызывается где то ещё. Возможно у вас должно быть, что то вроде:
    $db = $this->db->getNewInstance(); // возможно  $db = $this->db->update('view_journal');
        $db->where('id_journal', $id);
        $db->where('id_object', $objectID);
        $db->where('id_pupil', $pupilID);
        $db->where('date', $date);
        $db->set('rating', $rating);
        $db->update('view_journal');
        $db->exec();
    Ответ написан
    1 комментарий
  • Как хранить время последней активности пользователя в MySQL?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Общее для всех mysql:
    Проверить какой запрос отрабатывает система если replace то плохо если update или insert on duplicate key update - то ок.
    Если в action_history есть индексы кроме примари кей то их скорее всего стоит убрать т.к. вероятно запросы ( сортировки или агрегации) по этим полям будут приводить в любом случае к фулскану и индекс не будет иметь смысла, а при апдейте перестройка будет постоянно всё класть.

    Для Maria: убедиться, что в Maria XtraDB не сломана построчная блокировка (всё таки опыт продакшена у марии неё вялый ). Потом вызывает опасение реализация внешнего индекса в таблицах разного типа, возможно это как то может ломать построчную блокировку. Если у вас лок всей таблицы разберитесь откуда, так не должно быть

    В общем и целом, поразмышлять что INSERT DELAYED VALUES (1,2,3),(..,..,..),(N,N,N) для записи всех действий будет работать заметно веселее особенно без индексов и в одном потоке, а после некоторых шаманств с агрегацией по крону ещё не будет деградировать от распухания. Что можно про крону парсить access.log (понимать что он не рилтайм), в этом случае будет одна пачка апдейтов допустим раз в минуту и user_id будет заапдейчен только один раз, это будет пожалуй самой простой реализацией задачи упорядочивания и фильтрации потока апдейтов к mysql. Парсинг лога можно заменить на RabbitMQ, или написать своего демона который будет висеть на соке и рулить.

    Но смотрите если у вас задача в стиле показать последние 10 пользователей сделавших, что то, то это решается сильно иначе.
    Ответ написан
    2 комментария
  • Как проверить для поля на наличие их в дб?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    По полю text вам нормального индекса не построить, поэтому можно поступить так:
    1) добавить поле hash и сделать его unique key
    2) в поле hash писать что то типа md5(trim(title)+trim(text))
    3)
    INSERT INTO
      table
    SET
      `id` = ?,
      `title` = ?,
      `text` = ?,
      `hash`= ? 
    ON DUPLICATE KEY UPDATE
      id= ?

    Делает то же что replace только без удаления записи

    p.s. вы уверенны что вам надо обновлять поле id ? я спрашиваю потому, что оно обычно автоинкремент и примари кей, т.е. в таком случае обновить id на тоже значение, что уже существует не получиться.
    Ответ написан
    6 комментариев
  • PHP MySQL надо вставить текст с HTML тэгами в БД, но он не вставляется. Как правльно вставить?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Искать как сделать escape в mysql.
    INSERT .. SET text_field = "plan text" - у вас всё ок
    INSERT .. SET text_field = "html text" - ломает кавычки

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

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    SELECT `id`, `date`,   
       sum(if(Android is null,0,1)) as android, 
       sum(if(Android  is null,1,0)) as empty_android 
    FROM `vote` 
    GROUP BY DATE_FORMAT(`date`, '%Y-%M-%D')


    Если в колонке android пустая строка тогда
    SELECT `id`, `date`,
       sum(if(Android <> '',0,1)) as android,
       sum(if(Android  = '', 1,0)) as empty_android 
    FROM `vote` 
    GROUP BY DATE_FORMAT(`date`, '%Y-%M-%D')
    Ответ написан
    Комментировать
  • Как оптимизировать вот такой mysql запрос

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Избавьтесь от BETWEEN с ним всё всегда плохо, два варианта это сделать:
    1) Добавьте колонку INT которую заполните UPDATE accounts SET new_col = YEAR(date_visited_timestamp ) * 1000 + DAYOFYEAR(date_visited_timestamp )
    сделайте по ней индекс и дёргйте её через IN()
    2) используете гео индекс, он хорошо решает проблему с BETWEEN dev.mysql.com/doc/refman/5.7/en/populating-spatial-columns.html

    Другой вариант завидите новую таблицу
    server_id | counter | crdate
    И или на прошлую таблицу повесьте тригер на инсёрт или добавьте запрос в ваше приложение который будет инкрементить счётчик

    Третий вариант, совместить первые два.
    Ответ написан
    Комментировать