Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Data początku i końca wynajmu. Jak wyliczyć dni wynajmu w miesiącu/roku
trueblue
post 31.08.2019, 21:12:21
Post #21





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

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


Nie ma sensu robić daty ze stałej daty, po prostu wstaw na sztywno 2013-01-01 bez MAKEDATE, to też Ci sugerowałem.

Starczy Ci do 2040 roku. Przy założeniu, że startowy rok to 2013.


--------------------
Go to the top of the page
+Quote Post
wachcio
post 31.08.2019, 22:21:56
Post #22





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 17.07.2011

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


Bo robię coś źle i zapytanie:
  1. SELECT tmp.house_nr,YEAR(tmp.dzien) AS rok,MONTH(tmp.dzien) AS miesiac, COUNT(tmp.dzien) FROM (
  2. SELECT r.house_nr,k.dzien, `entry_owner_id` FROM reservations AS r
  3. CROSS JOIN(
  4. SELECT DATE_ADD(YEAR('2013-01-01'),INTERVAL a.a + 10 * b.a + 100*c.a + 1000*d.a DAY) AS dzien FROM
  5. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
  6. CROSS JOIN
  7. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
  8. CROSS JOIN
  9. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
  10. CROSS JOIN
  11. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
  12. ) AS k ON k.dzien>=r.start_date_of_rent AND k.dzien<=r.end_date_of_rent - 1 AND `entry_owner_id`=2
  13. ORDER BY r.house_nr,k.dzien
  14. ) AS tmp
  15. GROUP BY tmp.house_nr,DATE_FORMAT(tmp.dzien,'%Y-%m')


zwraca mi pusty wiersz

EDIT:
Chyba teraz będzie dobrze:
  1. SELECT tmp.house_nr,YEAR(tmp.dzien) AS rok,MONTH(tmp.dzien) AS miesiac, COUNT(tmp.dzien) FROM (
  2. SELECT r.house_nr,k.dzien, `entry_owner_id` FROM reservations AS r
  3. CROSS JOIN(
  4. SELECT DATE_ADD('2013-01-01',INTERVAL a.a + 10 * b.a + 100*c.a + 1000*d.a DAY) AS dzien FROM
  5. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
  6. CROSS JOIN
  7. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
  8. CROSS JOIN
  9. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
  10. CROSS JOIN
  11. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
  12. ) AS k ON k.dzien>=r.start_date_of_rent AND k.dzien<=r.end_date_of_rent - 1 AND `entry_owner_id`=2
  13. ORDER BY r.house_nr,k.dzien
  14. ) AS tmp
  15. GROUP BY tmp.house_nr,DATE_FORMAT(tmp.dzien,'%Y-%m')


Ten post edytował wachcio 31.08.2019, 22:23:32
Go to the top of the page
+Quote Post
trueblue
post 31.08.2019, 22:32:02
Post #23





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

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


ORDER BY nie jest potrzebne.


--------------------
Go to the top of the page
+Quote Post
wachcio
post 1.09.2019, 14:54:50
Post #24





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 17.07.2011

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


Cytat(trueblue @ 31.08.2019, 23:32:02 ) *
ORDER BY nie jest potrzebne.


To szczegół ale ok dzięki




Próbowałem na innej tabeli zrobić również raport. Z założenia miał dodać i pogrupować koszty miesiącami. Ale niestety poległem. Jestem chociaż blisko rozwiązania?

DESCRIBE costs;
+----------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| category_id | smallint(6) | NO | | NULL | |
| entry_owner_id | smallint(6) | NO | | NULL | |
| value | smallint(6) | NO | | NULL | |
| description | text | YES | | NULL | |
| cost_date | date | NO | | NULL | |
| date_added | timestamp | NO | | CURRENT_TIMESTAMP | |
+----------------+-------------+------+-----+-------------------+----------------+


DESCRIBE cost_categories;
+------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| owner_id | smallint(6) | NO | | NULL | |
| category | tinytext | NO | | NULL | |
| date_added | timestamp | NO | | CURRENT_TIMESTAMP | |
+------------+-------------+------+-----+-------------------+----------------+

SELECT * FROM costs;
+----+-------------+----------------+-------+-------------------------------------------------+------------+---------------------+
| ID | category_id | entry_owner_id | value | description | cost_date | date_added |
+----+-------------+----------------+-------+-------------------------------------------------+------------+---------------------+
| 1 | 1 | 2 | 204 | | 2019-08-31 | 2019-08-31 18:50:26 |
| 2 | 2 | 2 | 50 | domestos, zmywaki, płyn do mycia naczyń, mopy | 2019-07-30 | 2019-08-31 18:52:08 |
| 3 | 3 | 2 | 400 | Naprawa dzrzwi | 2019-08-22 | 2019-08-31 23:44:08 |
| 4 | 3 | 2 | 50 | Naprawa łóżka | 2019-08-22 | 2019-08-31 23:44:17 |
| 5 | 4 | 2 | 200 | Płytki | 2019-08-22 | 2019-08-31 23:44:46 |
| 6 | 1 | 2 | 400 | coś | 2019-07-31 | 2019-08-31 18:50:26 |
| 7 | 1 | 2 | 300 | coś | 2019-07-31 | 2019-08-31 18:50:26 |
| 8 | 4 | 2 | 400 | cosss | 2019-08-22 | 2019-08-31 23:44:46 |
+----+-------------+----------------+-------+-------------------------------------------------+------------+---------------------+

  1. SELECT YEAR(tmp.dzien) AS rok,MONTH(tmp.dzien) AS miesiac, tmp.value, SUM(tmp.value) AS sum_value FROM (
  2. SELECT r.value,k.dzien, `entry_owner_id` FROM costs AS r
  3. CROSS JOIN(
  4. SELECT DATE_ADD('2013-01-01',INTERVAL a.a + 10 * b.a + 100*c.a + 1000*d.a DAY) AS dzien FROM
  5. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
  6. CROSS JOIN
  7. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
  8. CROSS JOIN
  9. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
  10. CROSS JOIN
  11. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
  12. ) AS k ON r.cost_date AND `entry_owner_id`=2 AND r.value >0
  13. ORDER BY k.dzien, r.value
  14. ) AS tmp
  15. GROUP BY DATE_FORMAT(tmp.dzien,'%Y-%m')


Ten post edytował wachcio 1.09.2019, 14:54:43
Go to the top of the page
+Quote Post
javafxdev
post 1.09.2019, 16:06:10
Post #25





Grupa: Zarejestrowani
Postów: 73
Pomógł: 6
Dołączył: 27.10.2015

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


Czemu na siłę próbujesz to zrobić w MySql? Powiedziałeś że robisz to w Node.js - tam jesteś dobry - to zrób sobie funkcję np: (pseudokod)
  1. Map<YearMonth, Cost> getCostReport(...){
  2. beginTime = ...
  3. ....
  4. endTime =
  5. println("Czas wykonania raportu: " + (endTime - beginTime))
  6. return data;
  7. }


która zwróci Ci dane w formie raportu i jednocześnie policzy jak długo to trwało
1) wykonuj zapytania pojedynczo a całą logike sumowania zrób po stronie node.js - zobaczysz jaki będzie czas wykonania.
2) Następnie zmodyfikuj tą funkcję żeby pobierała wszystkie dane potrzebne do raportu jednym zapytaniem select * ... i grupowała tak samo jak w 1)
Jeżeli czasy wykonania raportu nie będą zadowalające to wtedy będziesz mógł myśleć o optymalizacji. Ale gwarantuje Ci że nie będzie to potrzebne.
Go to the top of the page
+Quote Post
wachcio
post 1.09.2019, 17:24:09
Post #26





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 17.07.2011

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


Dobry to za duże słowo wink.gif Lepszy niż w MySQL i może masz rację chyba trzeba będzie trudniejsze zapytania rozbijać i obrabiać w node.js
Go to the top of the page
+Quote Post
javafxdev
post 2.09.2019, 20:48:38
Post #27





Grupa: Zarejestrowani
Postów: 73
Pomógł: 6
Dołączył: 27.10.2015

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


Zrobiłem mały teścik jak to będzie wyglądać dla danych:

  1. INSERT INTO dates (id, start_date_of_rent, end_date_of_rent) VALUES (1, '2019-08-28', '2019-08-29');
  2. INSERT INTO dates (id, start_date_of_rent, end_date_of_rent) VALUES (2, '2019-08-31', '2019-09-1');
  3. INSERT INTO dates (id, start_date_of_rent, end_date_of_rent) VALUES (3, '2019-07-31', '2019-09-01');
  4. INSERT INTO dates (id, start_date_of_rent, end_date_of_rent) VALUES (4, '2020-01-01', '2020-12-31');
  5. INSERT INTO dates (id, start_date_of_rent, end_date_of_rent) VALUES (5, '2021-01-01', '2021-12-31');
  6. INSERT INTO dates (id, start_date_of_rent, end_date_of_rent) VALUES (6, '2022-01-01', '2022-12-31');


Jak widać masz tutaj całe lata 2020-2022 wynajęte smile.gif

kod w PHP który nie jest zoptymalizowany (iteruje dzień po dniu) ale pokazuje jak długo taki raport będzie się generował w najgorszym możliwym scenariuszu - czyli konieczność przejścia przez cały rok.

  1. $time_start = microtime(true);
  2. $houses = $db->getAllHouses();
  3. echo 'Getting data from db in seconds: ' . (microtime(true) - $time_start);
  4.  
  5. function count_days_in_row(string $beginDate, string $endDate): array
  6. {
  7. $return_array = [];
  8. $date = date_create($beginDate);
  9. $end_date = date_create($endDate);
  10. while ($date <= $end_date) {
  11. $date_format = date_format($date, "Y-m");
  12. $return_array[] = $date_format;
  13. $date = date_add($date, new DateInterval('P1D'));
  14. }
  15. return $return_array;
  16. }
  17.  
  18. function getHouseReport(array $houses)
  19. {
  20. $report = [];
  21. foreach ($houses as $house) {
  22. $days = count_days_in_row($house['start_date_of_rent'], $house['end_date_of_rent']);
  23. $report = array_merge($report, $days);
  24. }
  25. return array_count_values($report);
  26. }
  27.  
  28. var_dump(getHouseReport($houses));
  29. echo 'Total execution time in seconds: ' . (microtime(true) - $time_start);


Wynik:


  1. Getting data from db in seconds: 0.0042970180511475
  2. array (size=39)
  3. '2019-08' => int 34
  4. '2019-09' => int 2
  5. '2019-07' => int 1
  6. '2020-01' => int 31
  7. '2020-02' => int 29
  8. '2020-03' => int 31
  9. '2020-04' => int 30
  10. '2020-05' => int 31
  11. '2020-06' => int 30
  12. '2020-07' => int 31
  13. '2020-08' => int 31
  14. '2020-09' => int 30
  15. '2020-10' => int 31
  16. '2020-11' => int 30
  17. '2020-12' => int 31
  18. '2022-01' => int 31
  19. '2022-02' => int 28
  20. '2022-03' => int 31
  21. '2022-04' => int 30
  22. '2022-05' => int 31
  23. '2022-06' => int 30
  24. '2022-07' => int 31
  25. '2022-08' => int 31
  26. '2022-09' => int 30
  27. '2022-10' => int 31
  28. '2022-11' => int 30
  29. '2022-12' => int 31
  30. '2021-01' => int 31
  31. '2021-02' => int 28
  32. '2021-03' => int 31
  33. '2021-04' => int 30
  34. '2021-05' => int 31
  35. '2021-06' => int 30
  36. '2021-07' => int 31
  37. '2021-08' => int 31
  38. '2021-09' => int 30
  39. '2021-10' => int 31
  40. '2021-11' => int 30
  41. '2021-12' => int 31
  42. Total execution time in seconds: 0.037029981613159


Chyba czas rzędu 0.03 sek. jest wystarczający.

Natomiast to samo ćwiczenie w MySQL:
  1. 39 row(s) returned 0.954 sec / 0.000 sec


Jaki widać szybciej jest nawet robić to po stronie backendu niż w samym MySQL


Go to the top of the page
+Quote Post
trueblue
post 3.09.2019, 06:59:00
Post #28





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

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


javafxdev, ale chyba nie osiągasz takiego czasu w MySQL na tych danych, które podałeś? Ja u siebie mam 1.1-1.2s dla ok. 65 tys. wierszy.


--------------------
Go to the top of the page
+Quote Post
javafxdev
post 3.09.2019, 21:45:37
Post #29





Grupa: Zarejestrowani
Postów: 73
Pomógł: 6
Dołączył: 27.10.2015

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


Dla dokładnie
  1. SELECT count(*) FROM dates;


Wynik: 6


  1. SELECT YEAR(tmp.dzien) AS rok,MONTH(tmp.dzien) AS miesiac, COUNT(tmp.dzien) FROM (
  2. SELECT * FROM dates AS r
  3. CROSS JOIN(
  4. SELECT DATE_ADD('2013-01-01',INTERVAL a.a + 10 * b.a + 100*c.a + 1000*d.a + e.a*10000 DAY) AS dzien FROM
  5. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
  6. CROSS JOIN
  7. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
  8. CROSS JOIN
  9. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
  10. CROSS JOIN
  11. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
  12. CROSS JOIN
  13. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS e
  14. ) AS k ON k.dzien>=r.start_date_of_rent AND k.dzien<=r.end_date_of_rent
  15. ) AS tmp
  16. GROUP BY DATE_FORMAT(tmp.dzien,'%Y-%m');


Tylko zauważ że ja dałem jeszcze e*10000 - bo potrzebuję dla dat od 1970 roku.

Ciekawe ile będzie w PHP się liczyło dla 65k wierszy smile.gif

no cóż w PHP:


  1. SELECT count(*) FROM dates; = 98304


  1. Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 10485760 bytes)


Po modyfikacji kodu w PHP:

  1. Getting data from db in seconds: 0.25872802734375
  2. array (size=39)
  3. '2019-08' => int 283356
  4. '2019-09' => int 16668
  5. '2019-07' => int 8334
  6. '2020-01' => int 258323
  7. '2020-02' => int 241657
  8. '2020-03' => int 258323
  9. '2020-04' => int 249990
  10. '2020-05' => int 258323
  11. '2020-06' => int 249990
  12. '2020-07' => int 258323
  13. '2020-08' => int 258323
  14. '2020-09' => int 249990
  15. '2020-10' => int 258323
  16. '2020-11' => int 249990
  17. '2020-12' => int 258323
  18. '2022-01' => int 258323
  19. '2022-02' => int 233324
  20. '2022-03' => int 258323
  21. '2022-04' => int 249990
  22. '2022-05' => int 258323
  23. '2022-06' => int 249990
  24. '2022-07' => int 258323
  25. '2022-08' => int 258323
  26. '2022-09' => int 249990
  27. '2022-10' => int 258323
  28. '2022-11' => int 249990
  29. '2022-12' => int 258323
  30. '2021-01' => int 258323
  31. '2021-02' => int 233324
  32. '2021-03' => int 258323
  33. '2021-04' => int 249990
  34. '2021-05' => int 258323
  35. '2021-06' => int 249990
  36. '2021-07' => int 258323
  37. '2021-08' => int 258323
  38. '2021-09' => int 249990
  39. '2021-10' => int 258323
  40. '2021-11' => int 249990
  41. '2021-12' => int 258323
  42. Total execution time in seconds: 48.838152170181


Jak widać samo pobranie 100k wierszy idzie szybko natomiast liczenie przerwałem przy 50k i trwa to już prawie minutę.
W samym SQL nie udało mi się doczekać (nie czekałem dłużej niż 3 min).
Go to the top of the page
+Quote Post
trueblue
post 4.09.2019, 08:42:52
Post #30





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

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


Ja przy dodaniu 1000 oraz 10000 do UNION miałem czas 4 minuty 36 sekund (dla 65 tys. rekordów).
Przy samych 1000, 32 sekundy. A przy ograniczeniu ostatniego UNION do 4 (tak aby osiągnąć ok. pełne 10 lat), 11 sekund.
Tak więc nie jest tak różowo.

Trzeba wybrać optymalne rozwiązanie liczenia. Ewentualnie można liczyć na bieżąco niepoliczone rezerwacje i kumulować wynik w odrębnej tablicy.


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 4.09.2019, 09:17:15
Post #31





Grupa: Zarejestrowani
Postów: 1 562
Pomógł: 185
Dołączył: 20.03.2005
Skąd: Będzin

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


Ja osobiście uważam, że lepiej na bieżąco rezerwacje uzupełniać w osobnej tabeli np. reservations_calendar i w niej stworzyć pozycje: `dt`(date), `id_house` (int), `booked` (0,1)


Wtedy mamy proste zapytanie:

  1. SELECT DATE_FORMAT(`dt`, '%Y-%m'), COUNT(1), `id_house` FROM reservations_calendar WHERE `booked` = 1 GROUP BY DATE_FORMAT(`dt`, '%Y-%-m');


Ten post edytował Tomplus 4.09.2019, 10:25:16
Go to the top of the page
+Quote Post
trueblue
post 4.09.2019, 09:29:53
Post #32





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

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


A czy to zapytanie czasem nie liczy ilości rezerwacji, a nie dni? Ok, rozumiem, to już docelowe zapytanie dla "zarchiwizowanych" danych.

P.S. W formacie jest drobny błąd.

Ten post edytował trueblue 4.09.2019, 09:50:02


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 4.09.2019, 10:29:01
Post #33





Grupa: Zarejestrowani
Postów: 1 562
Pomógł: 185
Dołączył: 20.03.2005
Skąd: Będzin

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


Sądzę że w momencie gdy użytkownik kliknie `rezerwuję` to mają zaktualizować się rekordy z booked 0 na 1, więc sprawdzanie stanu rezerwacji może odbywać się na bieżąco.
Go to the top of the page
+Quote Post
javafxdev
post 4.09.2019, 20:02:46
Post #34





Grupa: Zarejestrowani
Postów: 73
Pomógł: 6
Dołączył: 27.10.2015

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


Podsumowując:

1) Można zrobić to zapytanie w MySQL - ale będzie wolno (w pewnych przypadkach, Twój hobbistyczny projekt tego nie odczuje)
2) Można zrobić liczenie w backendzie - będzie szybciej - w zależności jak bardzo przysiądziesz do optymalizacji liczenia (ale nie ma sensu się nad tym skupiać lepiej dowieźć inne funkcjonalności bo Twój projekt tego nie odczuje)
3) Można zrobić to tak jak zasugerował Tomplus - czyli dać lepszą strukturę w bazie danych - nie trzymać okresami tylko dzień po dniu - wtedy jak Ci z rezerwacji wypadnie jakiś dzień to nic nie musisz zmieniać - a w obecnej wersji będziesz musiał rozbić to na dwa rekordy - wtedy nie ma znaczenia czy będziesz liczył w MySQL czy backendzie bo będzie szybko (i w Twoim przypadku to chyba najlepsze rozwiązanie)

Wybierz mądrze bo możesz wybrać tylko jedno wink.gif
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.12.2019 - 08:34