Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Optymalizacja zapytań
devbazy
post
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 4
Dołączył: 10.08.2009

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


Witam

Przechodząc do sedna sprawy. Chciałbym zoptymalizować poniższe zapytania.

  1. $query = mysql_query("SELECT * FROM stc WHERE id_st=1 AND symbol='G'");
  2. $con .= '<div id="first">';
  3.  
  4. while($smth = mysql_fetch_array($query))
  5. {
  6. $con.= $smth['field'];
  7. }
  8.  
  9. $con.= '</div>';
  10.  
  11. $query = mysql_query("SELECT * FROM stc WHERE id_st=2 AND symbol='G'");
  12. $con .= '<div id="second">';
  13. while($smth = mysql_fetch_array($query))
  14. {
  15. $con .= $smth['field'];
  16. }
  17. $con.= '</div>';


Nie liczę na gotowca, lecz bardziej na wskazówki, informacje na temat funkcji, którymi powinienem się zainteresować.

Ten post edytował solid23 18.11.2009, 19:06:31
Go to the top of the page
+Quote Post
potreb
post
Post #2





Grupa: Zarejestrowani
Postów: 1 568
Pomógł: 192
Dołączył: 7.03.2005
Skąd: Warszawa

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


Możesz połączyć zapytania mysql i warunek w phpie, tylko nie wiem czy ma to sens.
Go to the top of the page
+Quote Post
1010
post
Post #3





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Po co robić dwa zapytania, skoro możesz to zrobić na jednym?
Go to the top of the page
+Quote Post
maly_pirat
post
Post #4





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 13.06.2007

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


Te zapytania niczym od siebie się nie różnią zgadza się? Oczywiście poza id_st, to może usuń te drugie zapytanie i daj
  1. (...) WHERE id_st IN(1,2)


W końcu będzie tylko jedno zapytanie :-)

Ten post edytował maly_pirat 18.11.2009, 19:26:35
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A więc tak...
1) Pierwsze w warunku zawsze powinno być te, które najbardziej okroi wyniki. Im mniej masz po pierwszym warunku wyników, tym lepiej, bo każdy kolejny AND leci już po mniejszej puli wyników.
2) Wyciągasz z bazy tylko pole o nazwie 'field', więc tylko je walnij do zapytania za SELECT, a nie *. To zmniejsza liczbę przesyłanych danych
3) Jeśli masz kilka opcji tych samych a tylko jedną różną to możesz wrzucić to jako jedno zapytanie z warunkiem zmiennym ujętym i wyszczególnionym w IN... tutaj miałbyś
  1. WHERE id_st IN (1, 2) AND symbol = 'G'
Choć symbol mocniej by Ci zjechał wynik więc pchnąłbym go jako pierwszy zaraz po WHERE, a nie jako drugi (nie znam rozkładu danych w bazie, ale zgaduję, że tych z symbol = 'G' jest o wiele mniej niż z id_st = 1 czy id_st = 2) (IMG:style_emoticons/default/smile.gif) Obrobić te dane w PHP można już jak chcesz sprawdzając poprzez wrzucene do wyniku nie tylko field, ale i id_st.
Go to the top of the page
+Quote Post
devbazy
post
Post #6





Grupa: Zarejestrowani
Postów: 93
Pomógł: 4
Dołączył: 10.08.2009

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


Dzięki za pomoc. Jednak wystąpił kolejny problem. Aktualnie kod wygląda tak (wszystkie pobrane rekordy wyświetlają się w divie o id "first", a powinny tylko te gdzie id_st=1):

  1. $query = mysql_query("SELECT id_st,field FROM stc WHERE symbol='G' AND id_st IN (1,2)");
  2. $smth = mysql_fetch_array($query);
  3. ($smth['id_st'] == 1)? $con .= '<div id="first">' : $con .= '<div id="second">';
  4. while($smth = mysql_fetch_array($query)) $con.= $smth['field'];
  5. $con.= '</div>';


Głównie zależy mi na tym, aby rekordy gdzie id_st jest równe "1" wylądowały w divie o id "first", a reszta (id_st=2) w divie o id "second".

Próbowałem też inaczej - wrzuciłem warunek w pętle - wszystko działało prawidłowo, lecz w każdym divie był wyświetlany tylko jeden rekord.

Ten post edytował solid23 19.11.2009, 18:10:01
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Popatrz na końcówkę mojego ostatniego posta. Tam już pisałem, że musisz to w PHP potem podzielić pod kątem id_st. Zrób sobie pomocniczą zmienną, zainicjuj ją pierwszą wartością jaka ma być w id_st i sprawdzaj czy id_st się zmieniło. Jeśli tak to zamknij dotychczasowy div i otwórz nowy. Oczywiście by nie robiło to co i rusz, to w zapytaniu posegreguj rekordy po id_st (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
devbazy
post
Post #8





Grupa: Zarejestrowani
Postów: 93
Pomógł: 4
Dołączył: 10.08.2009

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


Masz na myśli coś takiego? Nie wiem czy dobrze zrozumiałem.

  1. $query = mysql_query("SELECT id_st,field FROM stc WHERE symbol='G' AND id_st IN (1,2) ORDER BY id_st ASC");
  2. $smth = mysql_fetch_array($query);
  3. $id_st = 1;
  4. $con .= '<div id="first">';
  5. while($smth = mysql_fetch_array($query))
  6. {
  7. if($smth['id_st'] != $id_st) $con .= '</div><div id="second">';
  8. $con.= $smth['field'];
  9. }
  10. $con.= '</div>';
Go to the top of the page
+Quote Post
maly_swd
post
Post #9





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


  1. $query = mysql_query("SELECT id_st,field FROM stc WHERE symbol='G' AND id_st IN (1,2)");
  2.  
  3. $con1.= '<div id="first">';
  4. $con2.= '<div id="second">';
  5. while($smth = mysql_fetch_array($query))
  6. {
  7. if($smth['field']==1) $con1.= $smth['field']; else $con2.= $smth['field'];
  8. }
  9. $con1.= '</div>';
  10. $con2.= '</div>';
  11.  
  12. echo $con1;
  13. // tu jakies cos jak bys chcial
  14.  
  15. echo $con2;
Go to the top of the page
+Quote Post
devbazy
post
Post #10





Grupa: Zarejestrowani
Postów: 93
Pomógł: 4
Dołączył: 10.08.2009

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


Cytat
if($smth['field']==1)


Poprawka: if($smth['id_st'] == 1)

Nie wiem czy dokładnie o to chodziło thekowi, ale Twoje rozwiązanie, maly_swd jak najbardziej działa. Dzięki za pomoc, dostajecie "pomógł" (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
maly_swd
post
Post #11





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


"Poprawka: if($smth['id_st'] == 1)", no tak -> moje przeoczenie
Go to the top of the page
+Quote Post
thek
post
Post #12





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Widzę, że mój pomysł został dobrze zinterpretowany. Tylko zapomniano dopisać drobiazgu, o którym myślałem, że będzie odczytany między wersami. Przy każdym zmieniającym DIVy przejściu pętli $id_st się nadpisuje wartością $smth['id_st'], bo inaczej po zmianie wartości na 2 każdy kolejny wers będzie nowym div, a ma to nastąpić tylko w przypadku zmiany id_st. Dla dwóch różnych id_st algorytm maly_swd będzie moim zdaniem lepszym rozwiązaniem. W przypadku nieograniczonej liczby id_st mała modyfikacja mojego sprawi, że będzie on uniwersalny.

  1. $query = mysql_query("SELECT id_st,field FROM stc WHERE symbol='G' AND id_st > 0 ORDER BY id_st ASC");
  2. $smth = mysql_fetch_array($query);
  3. $id_st = 1;
  4. $con .= '<div id="kolejny_'.$id_st.'">';
  5. while($smth = mysql_fetch_array($query))
  6. {
  7. if($smth['id_st'] != $id_st) {
  8. $con .= '</div><div id="kolejny_'.$smth['id_st'].'">';
  9. $id_st = $smth['id_st'];
  10. }
  11. $con.= $smth['field'];
  12.  
  13. }
  14. $con.= '</div>';

Sam zerknij jak teraz działa dla G, niezależnie od id_st. A wymyślanie wielkiej ilości IF-ów staje się zbędne (IMG:style_emoticons/default/smile.gif)

Ten post edytował thek 20.11.2009, 11:23:40
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: 25.08.2025 - 02:47