Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Optymalizacja zapytań
Forum PHP.pl > Forum > Przedszkole
devbazy
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ć.
potreb
Możesz połączyć zapytania mysql i warunek w phpie, tylko nie wiem czy ma to sens.
1010
Po co robić dwa zapytania, skoro możesz to zrobić na jednym?
maly_pirat
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 :-)
thek
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) 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.
devbazy
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.
thek
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 smile.gif
devbazy
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>';
maly_swd
  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;
devbazy
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ł" smile.gif
maly_swd
"Poprawka: if($smth['id_st'] == 1)", no tak -> moje przeoczenie
thek
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 smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.