2015-07-08 12 views
5

Ich habe eine Reihe von Informationen, die ich explodiere es zu ID, Code und Nummer.Aktualisieren Sie Mindestwerte basierend auf einem anderen Wert - MySql

list ($id,$code,$num) = explode("~",$data); 

Ich muss es MySql aktualisieren basierend auf einzigartigen code mit mindestens num

Für nehme meine ersten drei Anfragen sieht aus wie

id = 9267399 
code = 5D:148 
num = 64 

id = 9267398 
code = 5D:186 
num = 71 

id = 9267397 
code = 5D:122 
num = 93 

Dann ist mein 4., hat der 5. Anfragen Code duplizieren 5D:148 mit verschiedenen IDs und Nummern.

id = 9267402 
code = 5D:148 
num = 22 

id = 9267563 
code = 5D:148 
num = 5 

Jetzt muss ich min(num) für doppelte code finden und diesen Datensatz zurück zu mysql aktualisieren. Meine Anfragen

$sql = "UPDATE table SET id = '9267398', num = '71' WHERE code = '5D:186' "; 
$sql = "UPDATE table SET id = '9267397', num = '93' WHERE code = '5D:122' "; 
$sql = "UPDATE table SET id = '9267563', num = '5' WHERE code = '5D:148' "; 

hier 5D:148 hat drei Anträge, in denen min(num) 5.

ich die doppelte code

$temp = array(); 
foreach ($code as $c) { 
    isset($temp[$c]) or $temp[$c] = 0; 
    $temp[$c] ++; 
} 
var_dump($temp); 

Das bin ich

array(3) {["5D:148"]=> int(3) ["5D:186"]=> int(1) ["5D:122"]=> int(1)} 
schenkt finden versucht haben, aussehen sollte

Ich bin hier fest, wie mache ich Suche min(num) und führen Sie meine Update-Abfrage basierend darauf

+0

Möchten Sie in der DB die Mindestanzahl "num" für einen "Code", den Sie jemals erhalten haben, oder das Minimum für einen Skriptlauf (Sitzung) haben? – teo

+0

ich brauche in DB. Sitzungen können nicht verwendet werden, da viele Anfragen gleichzeitig bearbeitet werden müssen. – Matarishvan

+0

Für jede Anfrage sollten Sie zuerst versuchen, es in einem Array zu speichern, und wenn es bereits existiert, dann vergleichen Sie die Nummer. Wenn es

Antwort

1

Looping durch das Array und prüfen, ob num ist niedriger als die vorherige.

Beispiel für Array $ data:

$data = array(
[0] => array('id' => 9267399, 'code' => '5D:148', 'num' => 64), 
[1] => array('id' => 9267398, 'code' => '5D:186', 'num' => 71) 
); 

-

<?php 

$array_to_add = array(); 

foreach($data AS $val) { 

    if(array_key_exists($val['code'], $array_to_add)) { 

     if((int) $val['num'] < (int) $array_to_add[$val['code']]['num']) { // Check if num is lower than the previous one 
      $array_to_add[$val['code']] = $val; // If yes, overwrite code key with new values 
     } 

    } else { 

     $array_to_add[$val['code']] = $val; // Add values to array if code doesn't exist in array_to_add 

    } 

} 

var_dump($array_to_add); // ARRAY TO ADD IN DATABASE 

foreach($array_to_add AS $val) { 

    mysql_query("UPDATE table SET id = ".mysql_real_escape_string($val['id']).", num = ".mysql_real_escape_string($val['num'])." WHERE code = '".mysql_real_escape_string($val['code'])."' "); 

} 

?> 

Tipp: Schauen Sie sich PDO und mysqli für eine bessere Nutzung der MySQL-Abfrage.

1

Also, was ist mit diesem - Sie können die Abfrage für alle Anfragen ausführen (Sie brauchen nicht die min in PHP zu finden) und schließlich haben Sie die min in DB (wegen "und num> 5") - ich nehme an, dass min ganze Zahl ist, nicht varchar:

UPDATE table SET id = '9267563', num = 5 WHERE code = '5D:148' and num > 5 
UPDATE table SET id = '9267563', num = 93 WHERE code = 'SD:122' and num > 93 
etc. 

nicht so anspruchsvoll, aber es sollte fo Sie arbeiten.

2

Ich denke, es ist eine ganz einfachere Lösung ... In der Tat ich es gerade getestet ...
UPDATE Tabelle SET id = '9267398', num = '71' WHERE code = '5D: 186'
ORDER BY-Code ASC LIMIT 1;

+0

Warum LIMIT 1? Sie nehmen an, dass Code nicht einzigartig ist - aber es ist. – teo

Verwandte Themen