Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Problem z przeliczaniem duzej ilości wierszy[PHP+SQL]
adrian512
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 30.06.2014

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


Witam wszystkich,

mam problem z przeliczeniem duzej ilosci wierszy w bazie danych a dokladniej w tabeli : DokFin mam 50tys wierszy, Historiafin mam 60tys wierszy, Towary okolo 6 tys wierszy.


potrzebuje program który pobierze mi w zaleznosci od dat ID dokumentu finansowego z DokFin, pozniej wyszuka to ID w tabeli HistoriaFin, następnie pobierze z HistoriaFin IDtowaru,cene zakupu i ilosc( cena i ilosc pomnoży i zapisze do zmiennej) a Id towaru wyszuka w tabeli Towary i pobierz idGrupy do której nalezy towar.

Napisałem cos takiego :

  1. $query = "select Id from DokFin where (DokFin.DataSprzedazy between '2014-06-01' and '2014-06-02') ";
  2.  
  3. $wynik = mysql_query($query);
  4. while ($rekord = mysql_fetch_array($wynik)) {
  5.  
  6. $tempiddok[]=$rekord['Id']; //pobieram Id dokumentu sprzedazy spelniajace zakres dat
  7. }
  8.  
  9. foreach ($tempiddok as $key => $val) {
  10. $query2 = "select IdTowaru, Ilosc, ce_zn from HistoriaFin where HistoriaFin.IdDokFin like '$val' "; //pobieram id towaru spelniajacego zakres dat
  11. $wynik2 = mysql_query($query2);
  12. while ($rekord2 = mysql_fetch_array($wynik2)) {
  13. $tempidtowaru[]=$rekord2['IdTowaru'];
  14.  
  15. // Sprawdzam do jakiej grupy nalezy towar///
  16.  
  17. //licze wartosc danego dokumentu magazynowego
  18. $wartosczakupu=$rekord2['Ilosc']*$rekord2['ce_zn'];
  19. $wartoscgrupy[$tempidgrupy]=$wartoscgrupy[$tempidgrupy]+$wartosczakupu;
  20. }


Problem w tym gdy daty są np odlegle o 3 miesiace to program wykonuje to dłuzej niz 8000sekund.. Ktoś pomoże jak to rozwiazac?
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




1) Do porownania konkretnej wartosci nie uzywa sie LIKE tylko =
2) To co tu wszystko masz, realizuje się jednym zapytaniem a nie petryliardem w petli jak masz teraz. Poczytaj o JOINach w mysql
Go to the top of the page
+Quote Post
Turson
post
Post #3





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


  1. SELECT DokFin.id, HistoriaFin.cena, HistoriaFin.ilosc, Towary.idGrupy
  2. FROM DokFin JOIN HistoriaFin ON DokFin.id = HistoriaFin.id
  3. JOIN Towary ON Towary.id = DokFin.id
  4. WHERE HistoriaFin.IdDokFin = DokFin.id AND (DokFin.DataSprzedazy BETWEEN '2014-06-01' AND '2014-06-02')


Ten post edytował Turson 30.06.2014, 11:58:39
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




@Turson, zapomniales o czyms....
HistoriaFin.IdDokFin = $val
(IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Turson
post
Post #5





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Podejrzewam, że IdDokFin jest integerem
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




A co ma piernik do wiatraka? Chodzi o to, ze zamiast $val ma byc nazwa kolumny z drugiego łączenia...
Go to the top of the page
+Quote Post
Turson
post
Post #7





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Aaa, myślałem że chodzi o brak '', a $val to jakaś zmienna z $_POST czy coś (IMG:style_emoticons/default/smile.gif)
Autor niech sam poprawi
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Nie, nie jest tozmienna z post...z kodu widac wyraznie, ze jest to zmienna z petli po idkach.... a poto przeciez zrobiles złączenie by tej petli nie bylo, nieprawdaz?
Go to the top of the page
+Quote Post
Turson
post
Post #9





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Cytat
myślałem że chodzi o brak '', a $val to jakaś zmienna z $_POST czy coś

Może niejasno, ale napisałem, że myslałem iż $val to zmienna niepochodząca z zapytań, nieprawdaż? (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował Turson 30.06.2014, 11:48:17
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Dlatego wyprowadzilem Cię z błędu, nieprawdaż?
Go to the top of the page
+Quote Post
Turson
post
Post #11





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Tak, ale dwukrotnie. W poście #7 napisałem, że już wiem co to jest $val, ale źle zrozumiałeś i w poście #8 wytłumaczyłeś jeszcze raz, więc nie zrozumiałeś kontekstui mojej wypowiedzi.
Ale my mamy problemy (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




(IMG:style_emoticons/default/smile.gif)
Nie mniej jednak mogles poprawić juz to zapytanie, skoro wiedzialec co jest czym. Autor nie koniecznie musi wiedziec co chciales tym zapytaniem osiągnąć i skoro juz mu dales gotowca, to moglby on byc poprawny.
Go to the top of the page
+Quote Post
adrian512
post
Post #13





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 30.06.2014

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


Dzięki bardzo za odpowiedź.

Próbuje na wszystkie sposoby mam coś takiego :

  1. $query = "SELECT DokFin.Id, HistoriaFin.ce_zn, HistoriaFin.Ilosc, Towary.IdGrupy
  2. FROM DokFin JOIN HistoriaFin ON DokFin.Id = HistoriaFin.Id
  3. JOIN Towary ON Towary.Id = DokFin.IdTowaru
  4. WHERE HistoriaFin.IdDokFin = DokFin.Id AND (DokFin.DataSprzedazy BETWEEN '2014-06-01' AND '2014-06-02') " ;
  5.  
  6.  
  7. $wynik = mysql_query($query);
  8. while ($rekord = mysql_fetch_array($wynik)) ....

I dostaje błąd:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in ( wskazuje na linijke: while ($rekord = mysql_fetch_array($wynik)) )
Go to the top of the page
+Quote Post
Turson
post
Post #14





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


  1. $wynik = mysql_query($query) or die(mysql_error());
Go to the top of the page
+Quote Post
adrian512
post
Post #15





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 30.06.2014

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


Dzięki, problem był z złą nazwą tabeli

Ale dalej długo to trwa, jest mozliwosc jeszcze jakoś to poprawić?
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




WHERE (DokFin.DataSprzedazy BETWEEN '2014-06-01' AND '2014-06-02') " ;
No i przydalby sie index na pole DataSprzedazy
Go to the top of the page
+Quote Post
adrian512
post
Post #17





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 30.06.2014

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


Zrobiłem wszystko jak pisałeś , jednak ten czas dalej taki sam.. (Historiamag zawiera 600tys wierszy,) macie jakieś jeszcze pomysly?
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Przy prawidlowym indeksie nie powinno byc takich problemow.

Pokaz jak wygląda akualne zapytanie oraz pokaz EXPLAIN z tego zapytania
Go to the top of the page
+Quote Post
adrian512
post
Post #19





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 30.06.2014

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


Nie wiem czy dobrze użyłem EXPLAIN(wstawiłem zamiast SELECT?)

Podaje kod jak wygląda:
  1.  
  2. $query = "EXPLAIN DokFin.Id, HistoriaFin.ce_zn, HistoriaFin.Ilosc, Towary.IdGrupy
  3. FROM DokFin JOIN HistoriaFin ON DokFin.Id = HistoriaFin.IdDokFin
  4. JOIN Towary ON Towary.Id = HistoriaFin.IdTowaru
  5. WHERE (DokFin.DataSprzedazy BETWEEN '2014-06-01' AND '2014-06-02') " ;
  6.  
  7.  
  8. $wynik = mysql_query($query) or die(mysql_error());
  9. while ($rekord = mysql_fetch_array($wynik)) {
  10.  
  11.  
  12.  
  13.  
  14.  
  15. $tempidgrupy=$rekord['IdGrupy'];
  16.  
  17. $wartosczakupu=$rekord['Ilosc']*$rekord['ce_zn'];
  18. $wartoscgrupy[$tempidgrupy]=$wartoscgrupy[$tempidgrupy]+$wartosczakupu;
  19.  
  20. }



oraz wynik EXPLAIN : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' HistoriaFin.ce_zn, HistoriaFin.Ilosc, Towary.IdGrupy FROM DokFin JOIN Histor' at line 1

Lub z PHPmyAdmin : Explain:
id, select_type, table,type,possible_keys,key,key_len,ref,rows ,Extra
1,SIMPLE,DokFin,range,DataSprzedazy,DataSprzedazy,3,NULL,1053,Using where
1,SIMPLE,Towary,ALL,NULL,NULL,NULL,NULL,9214,,Using join buffer
1,SIMPLE,HistoriaFin,ALL,NULL,NULL,NULL,NULL,547551,Using where; Using join buffer


Masz pomysl?
Go to the top of the page
+Quote Post
Turson
post
Post #20





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Nie zamiast select a przed
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 21.12.2025 - 18:43