Mam takie zapytanie
  1. SELECT o.id, o.uniqprodukt, d.id_fk FROM produkty o INNER JOIN produkty_dane d ON o.uniqprodukt= d.uniqprodukt WHERE o.id>26452


W tabeli produkty mam jak sama nazwa wskazuje produkty, każdy produkt ma unikalne ID (varchar) oraz zwykłe inkrementowane ID (INT). W tabeli produkt dane znajdują się dodatkowe dane to produktu z tabeli "produkty".
Łączyłem tabele kolumną uniqprodukt i niestety takie rozwiązanie nie było zbyt dobre chciałbym łączyć kolumny za pomocą zwykłego ID(INT), tak zapytania trwają o wiele szybciej.

Chciałbym powyższe zapytanie przerobić na UPDATE. Po prostu ustawić wartość "o.id" w kolumnie "d.id_fk". Wierszy jest ok 600tys dlatego przez php obliczyłem ze zajęłoby to ok 8dni biggrin.gif

PS. ten warunek na końcu to numer ile udało mi się wierszy przerobić do tej pory (26/600 tys tongue.gif)

Żeby lepiej przedstawić sytuacje zrobiłem screena:



Nie uchwyciłem sytuacji gdy danych do produktu jest więcej niż 1 ale to tylko będą kilka razy te same wiersze więc to niczego nie zmienia.

ROZWIĄZANIE

Jak zwykle... siedzę parę godzin żeby rozwiązać samemu problem, a olśnienie przychodzi dopiero jak napisze na forum wink.gif

Popełniłem taki skrypt php aby rozwiązać ten problem:

  1. <?php
  2. include('config.php'); // Plik z połączeniem do bazy
  3.  
  4. $pyta = mysql_query("SELECT o.id as ida,d.id as idb, o.idprodukt, idprodukt_fk FROM produkty o INNER JOIN produkty_dane d ON o.idprodukt= d.idprodukt WHERE");
  5. if (ob_get_level() == 0) ob_start(); //Włączamy flush do "wypluwania" danych ;)
  6. while($rek = mysql_fetch_array($pyta)) {
  7. $id = $rek['ida'];
  8. $idb = $rek['idb'];
  9.  
  10. $pyta2 = mysql_query("UPDATE produkt_dane SET idprodukt_fk='$id' WHERE id='$idb'");
  11.  
  12. //Takie własne obliczenia aby zobaczyć ile się wykonało
  13. $per = ($id/388621)*100;
  14. echo $id." / 388621 (".round($per, 2)." %)<br/>";
  15.  
  16. //Wypluwamy wynik po każdym przejściu pętli while
  17. flush();
  18. }
  19. ob_end_flush(); //Zakończenie flusha
  20.  
  21. ?>


Dodam, że pierwsze zapytanie zawierało ok 388 tys wierszy czyli skrypt miał do wykonania właśnie tyle zapytań UPDATE, całość trwała ok 2min smile.gif

Uczcie się na moim błędzie i nie używajcie do INNER JOIN zmiennych znakowych jako łącznika tylko zwykłe INTy exclamation.gif Nie będziecie musieli się bawić z przerabianiem takim jak powyżej wink.gif