помогите пожалуйста в базе огромное количество данных нектари данные повторяются. Нужно сделать проверку если запись в "Dogovor" встречается первая раз то нужно в "prioritet" записать "1" если второй раз тогда в "Prioriyet" записать "0" примерно нужно сделать вот так ID | Dogovor | prioritet 1----- 0001---------1 2 -----0002---------1 3 -----0001---------0 4 -----0003---------1 5 -----0002---------0 напиши пожалуйста PHP код или какую нибудь ссылку проста я в PHP еще новичок
Ура мозг заработал сам решил проблему $result = mysql_query ("SELECT Nom,count(Nom),Id from Test GROUP BY Nom",$db); $myrow = mysql_fetch_array ($result); do { if ($myrow['count(Nom)']>1) { $Prio=1; $Prioo=0; $resulttt = mysql_query ("UPDATE Test SET Prio='$Prio' WHERE Nom=$myrow[Nom]&&Id=$myrow[Id]"); $resulttt = mysql_query ("UPDATE Test SET Prio='$Prioo' WHERE Nom=$myrow[Nom]&&Id>$myrow[Id]"); } else { $Prio=1; $resultt = mysql_query ("UPDATE Test SET Prio='$Prio' WHERE Nom=$myrow[Nom]"); } } while ($myrow = mysql_fetch_array ($result));
еще один дувайлодрочер... вы понимаете назначение цикла do{...}while(...) и его отличие от цикла while(...){...} ? вы понимаете, что если результат вернет ноль строк, то в ответе автоматом появится пучок ошибок?
почему-то я сегодня добрый... игорь, забань меня до вечера а то я тут всем помогу =) SparrowRix, поэтапно: вот тут надо: 1. обязательно все имена полей/таблиц/баз данных взять в соответствующие кавычки 2. придумать псевдоним агрегированному полю просто потому что конструкция может быть значительно более емкой и обращаться потом к ней в коде просто полное уродство. 3. чисто визуально удобнее читать когда ключевые слова набраны верхним регистром. $result = mysql_query ("SELECT `Nom`, COUNT(`Nom`) `Nom_cnt`, `Id` FROM `Test` GROUP BY `Nom`", $db); вот эту конструкцию заменить на while ($myrow = mysql_fetch_array ($result)) { ......... } разница в том что дувайл будет выполнена как минимум один раз, вне зависимости от состояния, так как проверка условия выхода из цикла происходит после цикла. вайл же не будет выполнен если на входе сразу условие выхода. если оставить как есть то когда база вернет ноль строк то фетч_эрэй получит bool false и дальше в этом булевом значении попробуется найти индекс ['count(Nom)'] которого там не может быть так как это булево значение а не массив. следовательно, иф получит НЕ выполнение условия $myrow['count(Nom)'] > 1 и будет выполнена ветка элс - $Prio=1; $resultt = mysql_query ("UPDATE Test SET Prio='$Prio' WHERE Nom=$myrow[Nom]"); тут мы объявили переменную прио хотя мы можем сразу воткнуть эту единицу сразу в запрос. ну да ладно, не в этом проблема. проблема в том что Nom=$myrow[Nom] не будет работать даже когда там будет массив, не то что наш бул фолс. так вот короче этот запрос будет выполнен но вернет ошибку. но об этом чуть позже, сейчас закроем тему дувайлодрочерства. как уже было сказано, заменить надо на обычный вайл. тогда если строк в результате запроса не будет - сразу вернувшийся бул фолс заставит сразу обойти тело цикла. все в ожуре. ну тут с учетом того что мы от уродства избавляемся - имя соответствующее математике агрегирования меняется на псевдоним: if ($myrow['Nom_cnt']>1) { вот тут просто беда. делать надо не два а один запрос, && заменить на AND - так будет более наглядна разница между битовыми операциями и алгеброй логики, кавычки добавить и обязательно пофиксить добавление массива и работу с его индексом. "$myrow[Nom]" - для одномерного массива может и прокатит, но с многомерным обломаемся. первое что бросается в глаза это отсутствие кавычек вокруг имени индекса. значит это константа. ищем эту константу в памяти. не находим. заменяем на текстовое значение соответствующее имени не найденной константы. работает. но получим предупреждение. а если взять в кавычки то сразу обращаемся текстовым именем и все хорошо. теперь про многомерность. она потеряется так как работать будет до первой закрывающейся квадратной скобки. а поскольку она вернет массив то будет совершена попытка приведения массива к строке и все это дело заменится на простое слово Array пример: Код (Text): <?php error_reporting( E_ALL ); $myrow = array( 'Nom' => array(1 => 3, 2 => 4), 'Id' => 8 ); echo $myrow[Nom][1]; echo "$myrow[Nom][2] $myrow[Id]"; ?> ответ: Код (Text): PHP Notice: Use of undefined constant Nom - assumed 'Nom' in /tmp/tmp.php on line 8 PHP Stack trace: PHP 1. {main}() /tmp/tmp.php:0 3Array[2] 8 то есть мы видим что после замены константы на слово мы спокойно получаем нужную нам тройку из элемента с индексом 1. а вот значение индекса 2 там же но в контексте вставки в строку мы уже не можем получить. $myrow[Nom] заменяется на Array а указание индекса вставляется простым текстом [2] фикс: Код (Text): echo $myrow['Nom'][1]; echo "{$myrow['Nom'][2]} {$myrow[Id]}"; тест: Код (Text): 34 8 получили все что нужно и без предупреждений на один запрос переписывать не буду - лениво. и позволю себе сразу грохнуть три ненужные переменные $resulttt = mysql_query ("UPDATE `Test` SET `Prio`= 1 WHERE `Nom`={$myrow['Nom']} AND `Id`= {$myrow['Id']}"); $resulttt = mysql_query ("UPDATE `Test` SET `Prio`= 0 WHERE `Nom`={$myrow['Nom']} AND `Id`> {$myrow['Id']}"); $resultt = mysql_query ("UPDATE `Test` SET `Prio`= 1 WHERE `Nom`={$myrow['Nom']}"); как-то так...