Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как пересчитать доп. поле? [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 [2] 3 »   

> Без описания
illy
Отправлено: 22 Февраля, 2012 - 12:47:30
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




Viper это я и имел ввиду Хм


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
lamozavrik
Отправлено: 22 Февраля, 2012 - 13:07:20
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 4 раз(а)




Короче я так понимаю, что можно сделать вот такой запрос:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. DELETE FROM TABLE WHERE id = 2; UPDATE TABLE SET number = number - 1 WHERE id > 3
  3.  


но тут тогда возникает еще вопрос... На сколько будет медленным UPDATE, если после удаляемой строки идет большое количество записей?

Вернее тут два запроса... И можно ли как то DELETE и UPDATE соеденить в один?

(Отредактировано автором: 22 Февраля, 2012 - 13:09:27)



-----
Ударим крепким сном по мукам совести!
 
 Top
LIME
Отправлено: 22 Февраля, 2012 - 13:09:35
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




оооооочень медленным
 
 Top
lamozavrik
Отправлено: 22 Февраля, 2012 - 13:19:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 4 раз(а)




Мдя... Просто замкнутый круг (


-----
Ударим крепким сном по мукам совести!
 
 Top
LIME
Отправлено: 22 Февраля, 2012 - 13:20:53
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




почему же
выше я дал ссылку на ф-цию
чуть подумать и все получится))
 
 Top
lamozavrik
Отправлено: 22 Февраля, 2012 - 13:28:27
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 4 раз(а)




LIME, дай еще разок, а то ссылка не работает и меня выкидывает на главную страницу форума (


-----
Ударим крепким сном по мукам совести!
 
 Top
LIME
Отправлено: 22 Февраля, 2012 - 13:32:02
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




это форум сломался)) скопируй ссылку а адрес строку
 
 Top
lamozavrik
Отправлено: 22 Февраля, 2012 - 13:34:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 4 раз(а)




LIME, спасибо, уже так нашел ))
Подумаю, что можно сделать )


-----
Ударим крепким сном по мукам совести!
 
 Top
EuGen Администратор
Отправлено: 22 Февраля, 2012 - 14:09:52
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SET @rownum=0;
  2. UPDATE `table` SET `number`=(@rownum := @rownum+1);

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 22 Февраля, 2012 - 14:30:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




EuGen но ведь от тормозов сплошного апдейта большой базы это не поможет
 
 Top
EuGen Администратор
Отправлено: 22 Февраля, 2012 - 14:34:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




LIME
Это ответ на вопрос о перенумерации. Вопроса об оптимальности здесь не стоит. Да и какая может быть вообще оптимальность у такой задачи в общем случае? Если нужно перенумеровать, так в любом случае придется затронуть всю таблицу (что и происходит - как пример - в укзанном мною способе).
Дело другое, если есть некоторая логика и можно следить за нумерацией. но и тогда ситуация лишь немногим лучше - при сдвигании первых по номеру строк ситуация будет примерно такая же (то есть при перенумерации будет затронуто почти все множество строк).
По поводу рандомной выборки некоторого числа строк я приводил ссылки, но если важно быстродействие именно БД, можно просто выгрузить все id таблицы в массив и выбрать из него с помощью http://php.su/functions/?array_rand - это если не жалко памяти, расходуемой в скрипте.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 22 Февраля, 2012 - 14:39:41
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




EuGen пишет:
Вопроса об оптимальности здесь не стоит.
lamozavrik пишет:
но тут тогда возникает еще вопрос... На сколько будет медленным UPDATE, если после удаляемой строки идет большое количество записей?
EuGen пишет:
можно просто выгрузить все id таблицы в массив
а можно сиками переходить на рандомные ряды и фетчить только их в цикле
насколько я знаю большие результирующие таблицы приходят как-то не целиком
поэтому не будет память захламляться
 
 Top
EuGen Администратор
Отправлено: 22 Февраля, 2012 - 14:52:02
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Ах да, теперь вижу. Ну, в первоначальной формулировке задача так не ставилась, а я, должно быть, пропустил.
Если использовать mysql_data_seek - то нужно будет все равно генерировать случайную выборку неповторяющихся значений смещения. Это, разумеется, быстрее, чем делать запрос к БД наподобие того, что предложил я выше.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
lamozavrik
Отправлено: 22 Февраля, 2012 - 15:16:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 4 раз(а)




Пока что всем спасибо )) Ушел думать )) Как что придумаю, отпишу )


-----
Ударим крепким сном по мукам совести!
 
 Top
lamozavrik
Отправлено: 22 Февраля, 2012 - 17:44:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 4 раз(а)




Короче так, от доп поля я отказался и придумал другое решение на пыхе для вывода уникальных рандомных строк =))
Собственно вот, выставляю на ваш суд ))

PHP:
скопировать код в буфер обмена
  1.  
  2. $countRows = mysql_result(mysql_query("SELECT count(id) FROM table"), 0); //узнаем количество строк в таблице
  3.  
  4. $rows = array(mt_rand(0, $countRows)); //Заносим в массив с номерами строк первую строку
  5. $query = array(); //Создаём массив запросов
  6. $allRows = 9; //Кол-во уник. рандомных строк
  7.  
  8. if($countRows < $allRows){
  9.     $allRows = $countRows; //Если строк мньше чем надо
  10. }
  11.  
  12. for($i=0; $i<$allRows;){
  13.    
  14.     $rand =  mt_rand(0, $countRows);
  15.     $unic = true; // Устанавливаем чек
  16.    
  17.     for($j=0; $j<count($rows); $j++){
  18.        
  19.         if($rows[$j] == $rand){ //если в массиве с номерами строк есть уже такой номер
  20.             $unic = false; //Чек в фалсе
  21.             break;        
  22.         }
  23.        
  24.     }
  25.    
  26.     if($unic){ //Если чек истина
  27.         $rows[] = $rand;
  28.         $query[] = "(SELECT col FROM table LIMIT $rand, 1)"; //Составляем запрос и заносим в массив
  29.         $i++; //увеличиваем счетчик
  30.     }else{
  31.         continue; //иначе проходим по циклу еще раз
  32.     }
  33.    
  34. }
  35.  
  36. unset($rows); //Удаляем массив с номерами строк, он больше не нужен
  37. $query = implode(' UNION ', $query); //Соединяем запросы
  38.  
  39. $res = mysql_query($query); //и собственно сама выборка
  40.  


Вообщем как то так )

(Отредактировано автором: 22 Февраля, 2012 - 17:54:27)



-----
Ударим крепким сном по мукам совести!
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB