На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
  
> Select and update timestamp
    В данный момент у меня сделано следующим образом:
    ExpandedWrap disabled
      mysql_query('SELECT `id`, `data` FROM `table` WHERE `knock`<NOW()-123 AND ...');
      $ids = array();
      while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
      $ids[] = $row['id'];
      }
      mysql_query("UPDATE `table` SET `knock`=NOW() WHERE `id` IN (".implode(",", $ids).")");

    как вы понимаете, это ужасно медленно. есть какие-то способы обновить timestamp у тех строк, к которым сработал select оптимизированно, желательно одним запросом? мне пока ничего кроме триггера в голову не приходит (а триггер будет быстрее?)
    Сообщение отредактировано: Dart_Sitius -
      Насчёт мускуля - не специалист. На остальных движках всё просто:
      ExpandedWrap disabled
          update table_name set field_A = sysdate where field_B = 123;
          commit;
        Цитата Dart_Sitius @
        есть какие-то способы обновить timestamp у тех строк, к которым сработал select оптимизированно, желательно одним запросом?

        Если запрос детерминированный - то update с теми же условиями отбора. Иначе разве что выборка во временную таблицу, и затем обновление отобранных записей в основной таблице.

        Цитата Dart_Sitius @
        мне пока ничего кроме триггера в голову не приходит (а триггер будет быстрее?)

        У тебя в голове каша. Не существует триггеров, срабатывающих на отбор данных - триггеры бывают только на изменение.
          Цитата Dart_Sitius @
          обновить timestamp у тех строк, к которым сработал select оптимизированно, желательно одним запросом?

          SELECT во временную таблицу. UPDATE тех записей, ID которых есть во врененной таблице - одним запросом. SELECT из временной таблицы.

          Можешь об'яснить, зачем такой функционал нужен?
            #SI#, вы, кажется не поняли мой вопрос.
            Akina, MIF, уточню свой код:
            ExpandedWrap disabled
              // select, чтобы получить выборку и работать с ней
              mysql_query('SELECT `id`, `data` FROM `table` WHERE `knock`<NOW()-123 AND ...');
              // ids - вот это костыль, от которого хочу избавиться
              $ids = array();
              // здесь я обрабатываю данные селекта, выполняю payload к ним
              while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
              some_payload($row);
              // заодно запоминаю все id из select выборки
              $ids[] = $row['id'];
              }
              // от этого запроса я хочу избавиться. мне не нравится, что нужно делать 2 запроса
              mysql_query("UPDATE `table` SET `knock`=NOW() WHERE `id` IN (".implode(",", $ids).")");

            вы предлагаете делать select во временную базу, и затем update - но это не меняет дело, так как все равно запроса к базе данных будет 2.
            я хочу сделать примерно так:
            ExpandedWrap disabled
              mysql_query('SELECT `id`, `data` FROM `table` WHERE `knock`<NOW()-123 SET `knock`=NOW()');
              while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
              some_payload($row);
              }

            Т.е чтобы во время select сервис базы данных заодно обновил поле knock.
            Отсюда у меня возникли мысли про триггер (извиняюсь, не знал, что они только на изменение).

            Мне удалось нагуглить:
            http://www.bainweb.com/2011/10/mysql-updat...-timestamp.html
            где говорится следующее:
            Цитата
            There are more complicated ways to do this, but the basis is simple. You must insert an extra command into your query, and the simplest way is to separate them with a semicolon. And no, you cannot set up a trigger for select statements.

            Понял, единственное решение - все таки 2 запроса
              Цитата Dart_Sitius @
              #SI#, вы, кажется не поняли мой вопрос.
              :yes-sad:
                Цитата Dart_Sitius @
                где говорится следующее:

                Цитата Dart_Sitius @
                You must insert an extra command into your query, and the simplest way is to separate them with a semicolon.

                Там, похоже, говорится тоже что и здесь. Предложение Akina и мое можно записать в одну строчку с использованием точки с запятой.
                semicolumn - разделитерль команд.

                Добавлено
                Shодил по ссылке. Да, тот же совет , но в упрошенной форме - для SELECTa без фильтра WHERE и огранижения на детерминированность запроса
                  Цитата Akina @
                  Если запрос детерминированный - то update с теми же условиями отбора.

                  Сюда, кстати, надо добавить либо однопользовательское ограничение БД либо необходимость имплементаций только чистого чтения и блокировок прочтенных записей..
                    Цитата MIF @
                    Сюда, кстати, надо добавить либо однопользовательское ограничение БД либо необходимость имплементаций только чистого чтения и блокировок прочтенных записей..

                    Не надо. У MySQL есть такая фигня как SELECT ... FOR UPDATE.

                    Цитата MIF @
                    Предложение Akina и мое можно записать в одну строчку с использованием точки с запятой.

                    Нельзя. mysql_query не знает мультикоманды.
                      Цитата Akina @
                      Нельзя. mysql_query не знает мультикоманды.


                      Не уверен, так, чисто в качестве предположения. А так? :

                      ExpandedWrap disabled
                        UPDATE ... бла-бла-бла -- данные
                        UNION
                        UPDATE ... бла-бла-бла -- штамп-времени


                      Добавлено
                      либо:

                      ExpandedWrap disabled
                        INSERT INTO временная таблица SELECT * FROM -- временная выборка, с чем работали
                        UNION
                        UPDATE ... бла-бла-бла -- данные
                        UNION
                        UPDATE ... бла-бла-бла -- штамп-времени
                        JoeUser
                        Как показывает опыт, сервер не желает исполнять синтаксические конструкции, выдуманные воспалённым программистским сознанием. Работает исключительно в рамках собственного диалекта. Сволочь...
                          Цитата Akina @
                          Как показывает опыт, сервер не желает исполнять синтаксические конструкции, выдуманные воспалённым программистским сознанием. Работает исключительно в рамках собственного диалекта. Сволочь...

                          Честно говоря, я ориентировался на PostgreSQL, а там INSERT и UPDATE в качестве результата возвращают таблицу из одной строки и одного поля. Соответственно, я так понимаю, их группировать в запросе можно. В MySQL - не наю, поэтому просто предположил, что можно.
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0372 ]   [ 15 queries used ]   [ Generated: 27.04.24, 02:22 GMT ]