2015-07-08 12 views
5

Ho un set di informazioni, che sto esplodendo per id, codice e numero.Aggiornamento valori minimi in base a un altro valore - MySql

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

ho bisogno di aggiornarlo a MySQL sulla base di unico code con un minimo di num

Per supporre i miei primi 3 richieste assomiglia

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

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

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

Poi il mio 4 °, 5 ° richieste ha duplicato di codice 5D:148 con diversi ID e numeri.

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

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

Ora ho bisogno di trovare min(num) per duplicato code e aggiornare il record di nuovo a mysql. Le mie query dovrebbe essere simile

$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' "; 

qui 5D:148 dispone di 3 richieste in cui min(num) è 5.

ho cercato di trovare il duplicato code

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

Questo mi sta dando

array(3) {["5D:148"]=> int(3) ["5D:186"]=> int(1) ["5D:122"]=> int(1)} 

Sono bloccato qui come faccio trovare min(num) ed eseguire la mia query di aggiornamento basata su di esso

+0

Vuoi avere nel DB il "numero" minimo per un "codice" che hai ricevuto o il minimo per uno script eseguito (sessione)? – teo

+0

ho bisogno in DB. non è possibile utilizzare sessioni poiché ci sono molte richieste da gestire alla volta. – Matarishvan

+0

Per ogni richiesta, provare prima ad archiviarlo su un array e, se esiste già, confrontare il num. Se è

risposta

1

Fare un ciclo attraverso l'array e controllare se num è inferiore a quello precedente.

Esempio di $ array di dati:

$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'])."' "); 

} 

?> 

Tip: Guarda DOP e mysqli per un migliore utilizzo di MySQL Query di.

1

Quindi, per quanto riguarda questo - è possibile eseguire la query per tutte le richieste (non è necessario trovare il min in php) e infine si avrà il minimo in DB (a causa di "e num> 5") - suppongo che min è intero, non 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. 

non così sofisticato ma dovrebbe funzionare fo voi.

2

Penso che ci sia una soluzione molto più semplice ... In realtà ho appena provato ...
UPDATE tabella SET id = '9267398', num = '71' in cui il codice = '5D: 186'
ORDINA PER codice ASC LIMIT 1;

+0

Perché LIMIT 1? Supponi che il codice non sia unico, ma lo è. – teo

Problemi correlati