Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wykonanie zapytanie w pętli
Forum PHP.pl > Forum > Bazy danych > MySQL
115750
Mam dość skomplikowane zapytanie, które dla danego pracownika sumuje otrzymane w ciągu roku wypłaty (pensje, premie, dodatki itp).
Każdy taki składnik jest w osobnej tabeli i dlatego to zapytanie trochę się skomplikowało.
Jednak działa to bardzo dobrze dla jednego pracownika.

Potrzebowałbym teraz wykonać takie podsumowanie roczne dla wszystkich pracowników.
Czy mogę zatem użyć jakiejś pętli indeksowanej numerami id pracowników, żeby wygenerować taką listę?
viking
Możesz użyć podzapytania. WHERE id_pacownika IN(1,2,3,4) albo WHERE id_pacownika IN(SELECT id ....)
mortus
@viking: Przecież nie ma potrzeby wybierania id pracownika, bo trzeba to samo zrobić dla każdego, a to z kolei oznacza, że musimy "przelecieć" wszystkie rekordy z pracownikami.

@115750: Wykonywanie tak skomplikowanych (jak to sam nazwałeś) zapytań w pętli jest najgorszym z możliwych rozwiązań. Sprawnie będzie działać przy małej liczbie pracowników, ale przy większej liczbie pracowników "spalisz" serwer baz danych.

Jeśli już masz odpowiednie zapytanie napisane, działające dla jednego pracownika, to wystarczy, że wyrzucisz z klauzuli WHERE kolumnę odpowiedzialną za ograniczenie id pracownika. Jednak to czy Twoje rozwiązanie będzie optymalne, czy też nie zależy od struktury tabel w bazie danych i od tego, jak w tej chwili wygląda to Twoje zapytanie, a my na ten temat nic nie wiemy.
115750
Dziękuję za Wasze odpowiedzi.
Poradziłem już sobie modyfikując nieco moje zapytanie i stosując grupowanie z sumą według numeru pracownika.

  1. WHERE id_pacownika IN(1,2,3,4) albo WHERE id_pacownika IN(SELECT id ....)

To by chyba nie zdało egzaminu, bo klauzulę WHERE id_pacownika miałem aż 3 razy - z powodu unii.

Żeby nie być gołosłownym pokażę Wam tego potwora - zapytanie:

  1. SELECT T1.id_person, T1.podstawa*T3.podstawa_kwota + T1.dzieci*T3.dzieci_kwota - (T1.podstawa*T3.podstawa_kwota * T3.podstawa_stopa / 100) -
  2. (T1.dzieci*T3.dzieci_kwota*T3.dzieci_stopa / 100) AS kwota
  3. FROM lists_persons T1, persons T2 LEFT JOIN cities AS T4 ON T2.miasto = T4.id, lists T3 WHERE
  4. T3.zamknieta = 0 AND T2.id = T1.id_person AND T3.id = T1.id_list AND T1.id_person = 1885
  5. UNION ALL
  6. SELECT T1.id_person, T1.suma AS kwota FROM lists_persons T1, lists T2 WHERE T1.id_list = T2.id AND T2.zamknieta = 1 AND T1.id_person = 1885 AND T2.rok = 13
  7. UNION ALL
  8. SELECT p_id, kwota FROM other_benefits WHERE p_id = 1885 AND DATA LIKE "%2013-%"


Przerobiłem to do postaci:
  1. SELECT osoba, sum(kwota) AS suma FROM
  2. (
  3. SELECT T1.id_person AS osoba, T1.podstawa*T3.podstawa_kwota + T1.dzieci*T3.dzieci_kwota - (T1.podstawa*T3.podstawa_kwota * T3.podstawa_stopa / 100) - (T1.dzieci*T3.dzieci_kwota*T3.dzieci_stopa / 100) AS kwota
  4. FROM lists_persons T1, persons T2 LEFT JOIN cities AS T4 ON T2.miasto = T4.id, lists T3 WHERE T3.zamknieta = 0 AND T2.id = T1.id_person AND T3.id = T1.id_list
  5. UNION ALL
  6. SELECT T1.id_person AS osoba, T1.suma AS kwota FROM lists_persons T1, lists T2 WHERE T1.id_list = T2.id AND T2.zamknieta = 1 AND T2.rok = 13
  7. UNION ALL
  8. SELECT p_id AS osoba, kwota FROM other_benefits WHERE DATA LIKE "%2013-%"
  9. ) TX
  10. GROUP BY osoba
bpskiba
Zapytania, które wkleiłeś wcale nie są długie lub skomplikowane headsetsmiley.png widziałem wielokrotnie dłuższe.
To jest natomiast napisane dość niestarannie facepalmxd.gif
Mimo to nie powinno być problemów z czasem wykonania
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.