Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.253.170] |
|
Данный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
В данный момент у меня сделано следующим образом:
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 оптимизированно, желательно одним запросом? мне пока ничего кроме триггера в голову не приходит (а триггер будет быстрее?) |
Сообщ.
#2
,
|
|
|
Насчёт мускуля - не специалист. На остальных движках всё просто:
update table_name set field_A = sysdate where field_B = 123; commit; |
Сообщ.
#3
,
|
|
|
Цитата Dart_Sitius @ есть какие-то способы обновить timestamp у тех строк, к которым сработал select оптимизированно, желательно одним запросом? Если запрос детерминированный - то update с теми же условиями отбора. Иначе разве что выборка во временную таблицу, и затем обновление отобранных записей в основной таблице. Цитата Dart_Sitius @ мне пока ничего кроме триггера в голову не приходит (а триггер будет быстрее?) У тебя в голове каша. Не существует триггеров, срабатывающих на отбор данных - триггеры бывают только на изменение. |
Сообщ.
#4
,
|
|
|
Цитата Dart_Sitius @ обновить timestamp у тех строк, к которым сработал select оптимизированно, желательно одним запросом? SELECT во временную таблицу. UPDATE тех записей, ID которых есть во врененной таблице - одним запросом. SELECT из временной таблицы. Можешь об'яснить, зачем такой функционал нужен? |
Сообщ.
#5
,
|
|
|
#SI#, вы, кажется не поняли мой вопрос.
Akina, MIF, уточню свой код: // 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. я хочу сделать примерно так: 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 запроса |
Сообщ.
#6
,
|
|
|
Цитата Dart_Sitius @ #SI#, вы, кажется не поняли мой вопрос. |
Сообщ.
#7
,
|
|
|
Цитата 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 и огранижения на детерминированность запроса |
Сообщ.
#8
,
|
|
|
Цитата Akina @ Если запрос детерминированный - то update с теми же условиями отбора. Сюда, кстати, надо добавить либо однопользовательское ограничение БД либо необходимость имплементаций только чистого чтения и блокировок прочтенных записей.. |
Сообщ.
#9
,
|
|
|
Цитата MIF @ Сюда, кстати, надо добавить либо однопользовательское ограничение БД либо необходимость имплементаций только чистого чтения и блокировок прочтенных записей.. Не надо. У MySQL есть такая фигня как SELECT ... FOR UPDATE. Цитата MIF @ Предложение Akina и мое можно записать в одну строчку с использованием точки с запятой. Нельзя. mysql_query не знает мультикоманды. |
Сообщ.
#10
,
|
|
|
Цитата Akina @ Нельзя. mysql_query не знает мультикоманды. Не уверен, так, чисто в качестве предположения. А так? : UPDATE ... бла-бла-бла -- данные UNION UPDATE ... бла-бла-бла -- штамп-времени Добавлено либо: INSERT INTO временная таблица SELECT * FROM -- временная выборка, с чем работали UNION UPDATE ... бла-бла-бла -- данные UNION UPDATE ... бла-бла-бла -- штамп-времени |
Сообщ.
#11
,
|
|
|
JoeUser
Как показывает опыт, сервер не желает исполнять синтаксические конструкции, выдуманные воспалённым программистским сознанием. Работает исключительно в рамках собственного диалекта. Сволочь... |
Сообщ.
#12
,
|
|
|
Цитата Akina @ Как показывает опыт, сервер не желает исполнять синтаксические конструкции, выдуманные воспалённым программистским сознанием. Работает исключительно в рамках собственного диалекта. Сволочь... Честно говоря, я ориентировался на PostgreSQL, а там INSERT и UPDATE в качестве результата возвращают таблицу из одной строки и одного поля. Соответственно, я так понимаю, их группировать в запросе можно. В MySQL - не наю, поэтому просто предположил, что можно. |