Обход всех полей таблицы MySQL средствами PHP

krafty

new Exception
Обход всех полей таблицы MySQL средствами PHP

Возникла следующая задача. В БД MySQL есть таблица, в которой есть поле archive. Необходимо изменить последние $value записей: archive=0, а остальным установить признак archive=1.
Я пока додумался только до такого решения
PHP:
$res=mysql_query("SELECT count(*) FROM news");
    $f=mysql_fetch_array($res);
    for ($i=$f[0]; $i>=1; $i--)
    {
      if ($i<=$value)
        mysql_query("UPDATE news SET archive=0 WHERE id = $i");
      else
        mysql_query("UPDATE news SET archive=1 WHERE id = $i");
    }
Есть одно НО. Нельзя привязываться к id, поскольку нумерация может быть несплошная, например при удалении записей. Тогда этот код будет работать не так как хотелось бы.
 

SiMM

Новичок
[SQL]SELECT id FROM news ORDER BY id DESC LIMIT $value[/SQL]
[SQL]UPDATE news SET archive=0 WHERE id IN ($ids)[/SQL]
 

imaster

Новичок
$res=mysql_query("SELECT count(*) FROM news");

for ($i=count($f); $i>=1; $i--) {
$f=mysql_fetch_row($res);
if ($i<=$value)
mysql_query("UPDATE news SET archive=0 WHERE id = ".$f[$i][0]);
else
mysql_query("UPDATE news SET archive=1 WHERE id = ".$f[$i][0]);
}
 

krafty

new Exception
2SiMM
Спасибо. Стыдно признать, что не дочитал этого в мануале по MySQL
 

Фанат

oncle terrible
Команда форума
krafty
это ты его спрашиваешь, подойдёт ли ТЕБЕ такой запрос?
ты плохо спал?
или много пил?

постарайся немного думать головным отростком, прежде, чем строчить на форум.
 

Сергей123

Новичок

>> Сам-то не знаешь?
Нет, но, если бы мне надо было, я бы нашёл 5 минут подумать, почитать, попробовать и узнать.
 

krafty

new Exception
плохо спал. может кто-то подумал, что я пытаюсь получить от кого-то готовое решение. на самом деле это не так. я все прекрасно понимаю, что никто не обязан отвечать и никто никого не заставляет. еще раз говорю: в предыдущем посте я совершенно не пытался получить готовое решение. примите это за неудачную шутку.
 

Фанат

oncle terrible
Команда форума
да при чём здесь готове решение?
товарищ предположил, что тебе подойдёт предложенный вариант.
ТЕБЕ
ПРЕДЛОЖИЛИ
ВАРИАНТ.

от тебя требуется оценить вариант и решить - подходит он итебе или нет.
то есть, твоя дурь проявилась не в том, что ты якобы попросил готове решение, а в том, что ты не понял, что это тебе предлагают вариант.

ты просто забыл, где находишься.
похоже, ты забыл, что это ты задавал вопрос, и решил, что вопрос задаёт Сергей.
и давай критиковать.
 

krafty

new Exception
Фанат. Ты прав потребность в критике иногда возникает. Иногда это срабатывает против меня (как сейчас). Постараюсь себя контролировать. Ребята, извините, если кого обидел.

-~{}~ 17.08.05 11:43:

Сергею большое спасибо! Работает!
update news set archive=0 order by id desc limit 7

Понравилось предложение SiMMa.
SELECT id
FROM news
ORDER BY id DESC
LIMIT $value

UPDATE news SET archive = 0 WHERE id IN ($ids)

Первый запрос выбирает последние $value записей. Далее id этих записей заносятся в переменную $ids, которая собственно и используется во втором запросе. А как получить эту переменную? Синтаксис SQL требует так ...IN (value1, value2, ...).
fetch_array выдает $ids[0]=10; $ids[1]=10. Хотя должен возвращать последние $value id.
 

Dreammaker

***=Ф=***
Автор оригинала: krafty

UPDATE news SET archive = 0 WHERE id IN ($ids)

Первый запрос выбирает последние $value записей. Далее id этих записей заносятся в переменную $ids, которая собственно и используется во втором запросе. А как получить эту переменную? Синтаксис SQL требует так ...IN (value1, value2, ...).
Никто не пишет, может уже не нужно... :)
в этом случае что-то типа
$sql="UPDATE news SET archive = 0 WHERE id IN (". imploide(',',$ids).")";

а в первом запросе получаем массив...
 

Фанат

oncle terrible
Команда форума
Dreammaker
глаза разуй - http://phpclub.ru/talk/showthread.php?postid=507008#post507008
 

SiMM

Новичок
> Понравилось предложение SiMMa.
Я бы всё же пользовал решение Бресь Сергея. Просто не был уверен, что LIMIT там действует, а проверять было лениво.
 

DiTHER

bang bang
хыы..

UPDATE news SET archive = 0 WHERE id IN (SELECT id FROM news ORDER BY id DESC LIMIT $value).

тафталогияя....

update..order by.. limit.. проще. KISS
 
Сверху