witam
Czy jeśli robię update dla 1 użytkownika warto/trzeba budować tak zapytanie aby update był w 1 zapytaniu a nie w kilku ?

napisałem prosty kod którego zadaniem jest zbudowanie zapytania UPDATE z LEFT JOINem dla kilku tabel

  1. $id = 1;
  2.  
  3. $ustawienia_baza_tabela = array('tabela','tabela1','tabela2');
  4.  
  5. $ustawienia_baza_pole['win1'] = 1;
  6. $ustawienia_baza_pole['win2'] = 2;
  7. $ustawienia_baza_pole['win3'] = 3;
  8.  
  9. $ustawienia_baza_pole_laczace = 'id_laczace';
  10.  
  11. $literki = range('a','z');
  12.  
  13. $zapytanie = 'UPDATE '.$ustawienia_baza_tabela[0].' a ';
  14.  
  15. $suma_tabel = count($ustawienia_baza_tabela);
  16.  
  17. $l = 1;
  18. foreach ($ustawienia_baza_tabela as $aa => $war)
  19. {
  20. $zapytanie .= 'LEFT JOIN `'.$war.'` '.$literki[$l].' ON a.`'.$ustawienia_baza_pole_laczace.'` = '.$literki[$l].'.`'.$ustawienia_baza_pole_laczace.'` ';
  21. ++$l;
  22. }
  23.  
  24. $m = 0;
  25. $tab = array();
  26.  
  27. foreach($ustawienia_baza_pole as $pole_nazwa => $pole_wartosc)
  28. {
  29. if(isset($pole_nazwa))
  30. {
  31. array_push($tab, $literki[$m].'.'.$pole_nazwa . ' = \'' . mysql_real_escape_string($pole_wartosc) . '\'');
  32. ++$m;
  33. }
  34.  
  35. }
  36.  
  37. $zapytanie .= ' SET ' . implode(', ', $tab) . ' WHERE `'.$ustawienia_baza_pole_laczace.'` = ' . intval($id);
  38. echo $zapytanie;


prosił bym o naprowadzenie mnie jak wydajniej to zrobić
skrypt ma kilka problemów:
1) jeżeli nazwa klucza => $ustawienia_baza_pole['win1'] czyli pola są identyczne budowany jest tylko update na 1 pole.
2) na tą chwile skrypt "działa poprawnie" w przypadku gdy dla tabeli1 występuje 1 pole ..

prosił bym o naprowadzenie mnie jak to poprawić i czy to ma sens bo może jest jakaś inna metoda stworzenia tego strukturalnie z góry dziękuje


siedziałem trochę i napisałem coś takiego:
  1. $id = 1;
  2.  
  3. $tablica_baza = array(
  4. 'tabela' =>array('pole1' => 1,'pole2' => 2,'pole3' =>3,'pole4' =>4,'pole5'=>5),
  5. 'tabela2' =>array('pole6' => 1,'pole7' => 2,'pole3' =>3,'pole8' =>24,'pole9'=>53),
  6. 'tabela3' =>array('pole10' => 13,'pole11' => 22,'pole3' =>33,'pole135' =>43,'pole13'=>53),
  7. );
  8.  
  9. $literki = range('a','z');
  10.  
  11. $klucze_glowne = array_keys($tablica_baza);
  12. $suma_kluczy = count($klucze_glowne)-2;
  13.  
  14. $query = 'UPDATE ';
  15.  
  16. for($a=0;$a<=$suma_kluczy;++$a)
  17. {
  18. $query .= ' `'.$klucze_glowne[$a].'` '.$literki[$a].' LEFT JOIN `'.$klucze_glowne[$a+1].'` '.$literki[$a+1].' ON '.$literki[0].'.`id_char` = '.$literki[$a+1].'.`id_char`';
  19. if($a != $suma_kluczy){$query .= ' LEFT JOIN';}
  20. }
  21.  
  22. $query .= ' SET ';
  23.  
  24. $b = 0;
  25. foreach ($tablica_baza as $klucz => $wartosc)
  26. {
  27.  
  28.  
  29. foreach($wartosc as $klucz2 => $wartosc2)
  30. {
  31. echo $klucz2.' =>'.$wartosc2.'<bR>';
  32. $query .= $literki[$b].'.`'.$klucz2.'` = '.$literki[$b].'.`'.$klucz2.'` + '.$wartosc2.', ';
  33. }
  34.  
  35. //print_r($wartosc);
  36. echo '<br>';
  37. ++$b;
  38. }
  39.  
  40. $query .= " WHERE `id` = '".intval($id)."'";
  41.  
  42. echo $query;


jednak dalej nie wiem czy powinno się tak robić...
oczywiście mam jeszcze 2 problemy
1) przed warunkiem WHERE wyświetla "," więc będzie error (jutro do tego przysiądę)
2) drugim problemem jest zła składnia w pętli for (do tego też jutro usiądę)

Prosił bym o poradę ...