Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]Jest jakiś bufor zapytań MYSQL aby nie robić kilkunastu zapytań?
Forum PHP.pl > Forum > Przedszkole
adek-
Witam, jak w temacie. Mianowicie czy da się pobrać dane raz i dopiero je obrabiać i wyciągać co potrzeba i czy ogólnie warto pobrać całość danych i obrabiać je php, zamiast kilku zapytań?

Nakreślę wątek na moim przykładzie.
1. Mam dane 5 firm z miesięcznymi raportami i robię do każdej zapytanie sumujące w każdej z nich z osobna ostatni zamknięty miesiąc - 5 zapytań, oraz 1 zapytanie które sumuje i wyrzuca na stronę wszystkie firmy razem. Następnie robię 1 zapytanie które wyświetla mi wszystkie firmy i raporty z nich w danym miesiącu wg listingu kolejności dodania i wyświetla je na stronie. Tak więc 7 zpaytań, a drugie 7 zapytań robię z datą jeszcze niezakończonego miesiąca-teraźniejszego który wyświetla dane jako prognoza. Co by było gdybym chciał pobrać dane z całego roku i podzielić je na wyświetlanie każdego miesiąca z każdej firmy i porównywać je na wykresie np słupkowym, albo miesiąc do miesiąca, masakra zapytań?

2. Postanowiłem redukować zapytania i jeden watek teoretycznie chyba rozwiązałem, czyli pobieranie danych z każdej z firm na dany miesiąc - robię foreach'a, bądź "do while" i w WHERE daję zmienną która w pętli przeleci mi wszystkie firmy po np ID, więc tutaj jednym zapytaniem załatwiam kilka zapytań z 5 na 1. Poprawnie?
  1. //zamiast kilku takich wpisów
  2. $firma_1 = "SELECT COUNT(id_raportu) AS ilosc_raportow,
  3. SUM(kapital) AS suma_kapital,
  4. SUM(zysk) AS suma_zysk,
  5. SUM(sprzedaz) AS suma_sprzedaz,
  6. SUM(skup) AS suma_skup FROM raporty WHERE data_raportu = '$data_bilansu' AND id_spolki=1"; // i wcześniej poniżej były kolejne wpisy z id_spolki 2,3,4,5...n
  7. //chciałbym zrobić tak
  8. //pobieram liczbę firm
  9. $query_il_firm = "SELECT COUNT(id_firmy) AS ilosc_firm FROM firmy";
  10. //sprawdzam zapytanie i tworzę zmienną z sumą ilości firm
  11. $result = mysqli_query($query_il_firm, $sql) or die(mysqli_error($query_il_firm));
  12. $row = mysqli_fetch_array($result);
  13. $ilosc_firm= $row['ilosc_firm'];
  14. //robię do while
  15. do
  16. {
  17. $raporty_firm = "SELECT COUNT(id_raportu) AS ilosc_raportow,
  18. SUM(kapital) AS suma_kapital,
  19. SUM(zysk) AS suma_zysk,
  20. SUM(sprzedaz) AS suma_sprzedaz,
  21. SUM(skup) AS suma_skup FROM raporty WHERE data_raportu = '$data_bilansu' AND id_spolki='$i'";
  22. }
  23. while($i < $ilosc_firm);

Czy jest to poprawne myślenie i dobra forma? Pisane z palce nie testowane. Najpierw wole zapytać czy tak się robi ku gwoli dobrych praktyk programowania i czy to nie spowalnia storny np gdy będzie powyżej jakiejś ilości firm/raportów?

Bo pierwsze pytanie nasuwa mi się odnośnie tego, że trzeba będzie coś zrobić z nazewnictwem zapytania $raporty_firm, bo zmienna ta będzie posiadała załadowane już kilka firm, a wcześniej miałem $query_firma_1, 2, 3 itd i tak wyrzucałem to na stronie - strukturalnie najpierw jedna firmę, później drugą itd. Jak teraz mam zrobić aby jedna zmienna wyrzuciła mi wszystkie firmy w listingu?
CuteOne
1. Pobierz wszystkie firmy a potem wstaw do zapytania ich id
  1. SELECT * FROM raporty WHERE id_spolki IN (1,2,42,34,3254,23)


2. Za pomocą JOIN złącz firmy i raporty
adek-
CuteOne, ale co w wypadku gdy ilość firm może ulec zmianie - mam formularz dodawania dodatkowych firm, bo jest ich np coraz więcej,a chciałbym uniknąć ciągłego grzebania w kodzie i dodawania ich id, stąd chciałem sumować je zapytaniem.

2. Mam złączony joinem listing firm który mi wyświetla wszystkie raporty z wszystkich firm
  1. $query = "SELECT poz1, poz2, poz3, poz4, pm.miasto
  2. FROM raporty AS rap
  3. INNER JOIN placowki AS k
  4. USING(id_placowki)
  5. INNER JOIN spolki AS s
  6. USING(id_spolki)
  7. INNER JOIN placowka_miasto AS pm
  8. USING(id_miasto)
  9. WHERE data_raportu = '$data_bilansu' ORDER BY $sortuj DESC";


ale tutaj bardziej chodziło mi o zapytania które sumują cały miesiąc w poszczególnej firmie i wyświetlają je zsumowane jedna pod drugą, tak aby nie robić tego php a liczyć już w zapytaniu.
nospor
Cytat
CuteOne, ale co w wypadku gdy ilość firm może ulec zmianie - mam formularz dodawania dodatkowych firm, bo jest ich np coraz więcej,a chciałbym uniknąć ciągłego grzebania w kodzie i dodawania ich id, stąd chciałem sumować je zapytaniem.
Przeczytaj jeszcze raz co napisal cuteone. Zauwaz, ze nigdzie nie napisal, ze masz recznie wstawiac ID....


A teraz cos ode mnie
Skoro pobierasz raporty dla wszystkich firm, to na grzyba robisz tam WHERE na firmy? Skoro wszystkie to wszystkie.
mmmmmmm
$raporty_firm = "SELECT id_spolki, COUNT(id_raportu) AS ilosc_raportow,

SUM(kapital) AS suma_kapital,

SUM(zysk) AS suma_zysk,

SUM(sprzedaz) AS suma_sprzedaz,

SUM(skup) AS suma_skup FROM raporty WHERE data_raportu = '$data_bilansu' GROUP BY 1";
nospor
@mmmm a po co tam group by 1 ?
adek-
nospor masz rację, zbyt żwawo podjąłem kroki mówienia w stosunku do analizy tego co napisał CuteOne, ale zrobiłem to dlatego, że w przykładzie zobaczyłem po prostu ID ręcznie wpisane. Wiem już o co chodzi i zastanawiam się czy mam te id firmy również foreachem, bądź dowhilem wrzucić? Zaraz postaram się jeszcze raz przeanalizować i zrobić jakieś zapytanie.

A odnośnie "coś od siebie' to zrobiłem to dlatego, że narazie pobieram x wpisami SQL sumy wartości z x firm, czyli mam 5 wpisow SQL i każdy pobiera zsumowane wartości pojedynczej firmy, które później wyrzucam jeden pod drugim w tabeli.
  1. <tr>
  2. <?php if($result = mysqli_query($raport_firma_1)) : ?>
  3. <?php while ($dane = mysql_fetch_assoc($result)) : ?>
  4.  
  5. <td>Raport Firma 1: <?php if(!isset($data_bilansu)) { echo $data_last; } else { echo $data_bilansu; } ?></td>
  6. <td><?php echo $dane['ilosc_placówek']; ?></td>
  7. <td><?php echo number_format((double) $dane['suma_kapital'], 2, '.', " "); ?></td>
  8. <td><?php echo number_format((double) $dane['suma_zysk'], 2, '.', " "); ?></td>
  9. <td><?php echo number_format((double) $dane['suma_sprzedaz'], 2, '.', " "); ?></td>
  10. <td><?php echo number_format((double) $dane['suma_skup'], 2, '.', " "); ?></td>
  11.  
  12. <?php endwhile; ?>
  13. <?php endif; ?>
  14. </tr>
  15. //....n powtórzeń tego wpisu w zależności od ilości firm

Tak że pobierałem każdą firmę pojedynczo sumując dany miesiąc w zapytaniu SQL poprzez SUM() i wyświetlałem pojedynczo w rzędach te wartości przykładem powyżej. A dopiero poniżej pobierałem wszystkie firmy i raporty z danego miesiąca innym pojedynczym zapytaniem tak jak mówisz i wyświetlałem wszystkie raporty poniżej tych zsumowanych danych aby widzieć który raport co wnosi.

Wiem średniowiecze jeśli chodzi o mój kod i wstępną logikę, ale narazie to był jedyny sposób jaki znałem i potrafiłem wdrożyć - mozolny! I w końcu stwierdziłem że muszę zapytać o podpowiedź osób doświadczonych.

------- edytowano
chyba że jest możliwość pobrania wszystkich raportów z wszystkich firm i wszystkich miesięcy i przetrzymywania tego w jakiejś tabeli tymczasowej czy czymś takim żeby nie robić tysiąca zapytań i ewentualnie prostym zapytaniem wyświetlanie żądanej wartości nie sumując i nie przeliczając też funkcjami w PHP?
nospor
Robisz normalne zapytanie jakie miales do tej pory z sumowanie, tylko zamiast WHERE na id_spolki grupujesz po spolce GROUP BY id_spolki. I po sprawie
mmmmmmm
Cytat(nospor @ 25.11.2013, 14:52:51 ) *
@mmmm a po co tam group by 1 ?

Bo 1 to id_spolki
nospor
@mmmmmm troche podstaw:
Po group by podaje sie nazwe kolumny, po ktorej chcesz grupowac, a nie wartosc
mmmmmmm
Cytat(nospor @ 25.11.2013, 16:00:56 ) *
@mmmmmm troche podstaw:
Po group by podaje sie nazwe kolumny, po ktorej chcesz grupowac, a nie wartosc

Nie żartuj...
Sprawdź, jak już coś chcesz pisać i podważać czyjeś zdanie...
nospor
Zwracam honor. group by moze przyjmowac pozycje kolumny zamiast jej nazwe.... obled jakis LOL

ciezko bylo napisac: group by id_spolki zamiast group by 1? sadzilem ze grupujesz po wartosci 1 wink.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.