Fakty: są trzy firmy, każda z nich ma około 2,3 lokale i to jest skrypt dodający umowy tych lokali przypisanych do danej firmy i informujący mnie kiedy się kończy umowa najmu, jaka jest kwota najmu i jaka jest kaucja. Do każdego lokalu można dodać więcej niż jedną umowę, ale brana jest pod uwagę tylko ta ostatnio dodana (najbardziej aktualna) w zapytaniu zrobiłem inner joina z MAX(timestamp) i zapytanie listuje mi ostatnio dodaną umowę na każdy z punktów. Wszystko ok, więc może trochę kodu... zapytanie do bazy i pętla która mi sumuje dwie wartości, czynsz i kaucja:
$sql = "SELECT kr.*, ks.id_spolki, ks.skrot from lokal_rent kr inner join ( select id_lokal, max(timestamp) as latest from lokal_rent group by id_lokal ) kr2 on kr.timestamp = kr2.latest and kr.id_lokal = kr2.id_lokal left join spolki ks on kr.id_spolki = ks.id_spolki order by kr.id_lokal desc";
$rent_prize = 0; $deposit_prize = 0; while ($row = mysqli_fetch_array($result)) { 'id' => $row['id'], 'id_lokal' => $row['id_lokal'], 'skrot_firmy' => $row['skrot_firmy'], 'rent_prize' => $row['rent_prize'], 'deposit_prize' => $row['deposit_prize']); //dodawanie zmiennych w rzędzie }
wyrzuca mi dane poprawne, wszystko się przelicza jak powinno, ale teraz moje pytania, jako, że nie mogłem sobie z tymi kwestiami poradzić, tzn mogę, ale używam kilku osobnych zapytań, a chcę wiedzieć, czy to jedno tylko bardziej rozbudowane będzie mogło obsłużyć to wszystko o czym mówię poniżej?
1. Czy da się w jakiś łatwy sposób poza sumowaniem aktywnych umów, co mam zrobione powyżej w php, zrobić w tym zapytaniu dodatkowo sumowanie wg. firm? Gdy dawałem group by id_spolki przed order by, to zapytanie od razu zmieniało swoje wyniki i nie spełniało założeń, a usunąć ani zmienić order by id_lokal na coś innego nie mogę, bo wtedy będzie mi wyświetlać wadliwie wyniki po max(timestamp) czyli tych najnowszych umowach. Zacząłem już robić pole active=0/1 i dodanie każdej następnej umowy w założeniu będzie dezaktywowało poprzednią active=0 zostawiając ostatnią aktywną=1, wtedy pozbędę się problemu z max(ts) i będę mógł użyć WHERE active=1. W dobrym kierunku idę?
2. Gdy chciałem sumować w samym zapytaniu sql rent_prize i deposit_prize poprzez SUM() zapytanie zmieniało całkowicie swój wynik, nie ważne czy było to w zapytaniu głównym, czy podzapytaniu (inner join)! Stąd ten temp array. Czy faktycznie nie dałoby się też tego zrobić unikając niepotrzebnych tablic w php?
3. Chciałem też nieskutecznie zrobić liczenie ilości umów dodanych w danym lokalu i wyświetlić ich liczbę obok nazwy lokalu, ale jedyne na co moja wiedza mi pozwalała to w tym zapytaniu zliczyć ilość wierszy jakie wyrzuca zapytanie - $num_rows = mysqli_num_rows($result);, czyli nie to o co mi chodziło.
3. Ostatni pomysł, trochę czasochłonny, ale może tutaj próbować zrobić temp_table, wrzucać wszystkie potrzebne dane, sumować co chce i jak chce itd? Ale de facto mija się to z moim pierwszym założeniem - zrobić jak najwięcej można w jednym zapytaniu, bo równie dobrze mogę to wszystko zrobić zamiast temp_table to poprzez kilka odrębnych zapytań! W sumie to nawet nie wiem która opcja jest bardziej poprawna i uznawana, więcej zapytań i tablic array, czy tworzenie temp_table za pomocą PHP i odczytywanie z nich (tablica działa do czasu wylogowania użytkownika, więc zapewne mniej obciąża system, niż ciągłe liczenie w PHP i zadawanie ciągle tych samych zapytań).
Proszę o nakierowanie. Jeśli będzie potrzeba coś udostępnić z dodatkowym kodem to z chęcią! Chociaż sprawne zapytanie jest, ale wiedzy brak!
