Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql]Jest jakiś bufor zapytań MYSQL aby nie robić kilkunastu zapytań?
adek-
post
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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?

Ten post edytował adek- 25.11.2013, 09:26:29
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


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
Go to the top of the page
+Quote Post
adek-
post
Post #3





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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.

Ten post edytował adek- 25.11.2013, 09:41:03
Go to the top of the page
+Quote Post
nospor
post
Post #4





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




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.
Powód edycji: [nospor]:
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #5





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


$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";
Go to the top of the page
+Quote Post
nospor
post
Post #6





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




@mmmm a po co tam group by 1 ?
Go to the top of the page
+Quote Post
adek-
post
Post #7





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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?

Ten post edytował adek- 25.11.2013, 15:04:50
Go to the top of the page
+Quote Post
nospor
post
Post #8





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




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
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #9





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Cytat(nospor @ 25.11.2013, 14:52:51 ) *
@mmmm a po co tam group by 1 ?

Bo 1 to id_spolki
Go to the top of the page
+Quote Post
nospor
post
Post #10





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




@mmmmmm troche podstaw:
Po group by podaje sie nazwe kolumny, po ktorej chcesz grupowac, a nie wartosc
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #11





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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...
Go to the top of the page
+Quote Post
nospor
post
Post #12





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




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