Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak przerobić to zapytanie na UPDATE (problem rozwiązany ;), INNER JOIN w UPDATE
Sztef89
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.12.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/biggrin.gif)

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

Żeby lepiej przedstawić sytuacje zrobiłem screena:

(IMG:http://img97.imageshack.us/img97/591/aaaxv.png)

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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

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

Ten post edytował Sztef89 29.11.2011, 18:09:20
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 13:34