Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana pojedynczych rekordów w bazie MySQL wg szczególnego algorytmu
Forum PHP.pl > Forum > PHP
zbysiusp
Witam!

Bardzo proszę o pomoc w rozwiązaniu następującego problemu. Algorytm jak dla mnie jest skomplikowany dlatego przedstawię oczekiwany sposób działania skryptu PHP opisowo i na rycinie.

Etap 0: Pobieramy 3 ostatnie rekordy z bazy danych z polami: ID, windseed (ten etap uzyskałem)
Etap 1: Jeżeli w najnowszym rekordzie nr 1 wartość "windspeed=0" nic nie rób (koniec)
Etap 2: Jeżeli w najnowszym rekordzie nr 1 wartość "windspeed>0" np. 5, zbadaj wartość "windspeed" w rekordzie nr 2.
Etap 3: Jeżeli w rekordzie nr 2 wartość "windspeed>0" np. 3 nic nie rób (koniec)
Etap 4: Jeżeli w rekordzie nr 2 wartość "windspeed=0", zbadaj wartość "windspeed" w rekordzie nr 3.
Etap 5: Jeżeli w rekordzie nr 3 wartość "windspeed=0" nic nie rób (koniec)
Etap 6: Jeżeli w rekordzie nr 3 wartość "windspeed>0" np. 7, wylicz średnią "windspeed" z rekordu nr 1 (5) i nr 3 (7) i wpisz ją (update) w miejsce 0 w rekordzie nr 2 "windspeed=6"

Oczekiwany sposób działania skryptu PHP

Dziękuję za pochylenie się nad tematem i pozdrawiam
zbysiusp
maly_swd
No to pochwal się co już zrobiłeś smile.gif

Przecież to parę ifów.
zbysiusp
Cytat(maly_swd @ 13.02.2017, 11:06:38 ) *
No to pochwal się co już zrobiłeś smile.gif

Przecież to parę ifów.


Problem rozwiązany. Algorytm działa jak należy. Mam 15 if-ów biggrin.gif

Dziękuję za zainteresowanie.
maly_swd
A więc pochwal się.
Inni może coś się nauczą biggrin.gif
zbysiusp
Cytat(maly_swd @ 13.02.2017, 17:03:44 ) *
A więc pochwal się.
Inni może coś się nauczą biggrin.gif


1. Pobieramy najnowszy rekord z bazy danych z polami ID i windspeed w celu ustalenia indeksu wyjściowego (ID).
2. Pobieramy trzy najnowsze rekordy z bazy danych z polami jak wyżej.
3. W pętli while (3 obiegi) odczytujemy wartość windspeed dla kolejnych 3 wartości ID dekrementując ją (ID, ID-1, ID-2).
4. Wszelkie dalsze działania uzależniamy od spełnienia warunku (windspeed0>0 && windspeed1=0 && windspeed2>0).
5. Gdy warunek zostaje spełniony obliczamy nową wartość windspeed1 ((windspeed0+windspeed2)/2.
4. Wykonujemy update drugiego rekordu z nową wartością windspeed1 i gotowe.
biggrin.gif
Pozdrawiam
maly_swd
Pokaż kod.
Pyton_000
Cytat(zbysiusp @ 13.02.2017, 13:23:58 ) *
Problem rozwiązany. Algorytm działa jak należy. Mam 15 if-ów biggrin.gif

Dziękuję za zainteresowanie.


15 IF-ów ? dostal.gif worriedsmiley.gif blink.gif

Przecież wystarczy Ihmo tylko tyle:
  1. <?php
  2.  
  3. $sql = "SELECT * FROM `table` ORDER BY id DESC LIMIT 3";
  4. $stm = $this->src_db->prepare($sql);
  5. $stm->execute();
  6.  
  7. $records = $stm->fetchAll(PDO::FETCH_ASSOC);
  8.  
  9. if(count($records) === 3) {
  10. if($records[0]['windspeed'] > 0 && $records[1]['windspeed'] == 0 && $records[3]['windspeed'] > 0 ) {
  11. $records[2]['windspeed'] == ($records[0]['windspeed'] + $records[3]['windspeed']) / 2;
  12. }
  13. }
zbysiusp
Cytat(Pyton_000 @ 15.02.2017, 09:49:43 ) *
15 IF-ów ? dostal.gif worriedsmiley.gif blink.gif


Dziękuję bardzo za kod. Wyszło tyle IF-ów bo oprócz windspeed dorzuciłem jeszcze 4 inne zmienne, ale z pewnością przekombinowałem.
Zamieszczam mój kod. Spójrz proszę na niego fachowym okiem i oceń.
  1. // Pobieramy ID najnowszego rekordu, aby ustalić jego numer potrzebny do dalszych obliczeń
  2. $wynik2 = mysql_query("SELECT ID FROM tab_czujniki_2 ORDER BY ID DESC LIMIT 1");
  3.  
  4. if(mysql_num_rows($wynik2) > 0) {
  5.  
  6. while($r2 = mysql_fetch_assoc($wynik2)) {
  7. $wynik_id = $r2['ID'];
  8. }
  9. }
  10.  
  11. // Pobieramy 3 najnowsze rekordy, pola: ID, czas_datetime, wind_speed_average do dalszych obliczeń
  12. $wynik = mysql_query("SELECT ID, czas_datetime, wind_speed_average, windgust, wind_direction_average, compass FROM tab_czujniki_2 ORDER BY ID DESC LIMIT 3");
  13. if(mysql_num_rows($wynik) > 0) {
  14.  
  15. while($r = mysql_fetch_assoc($wynik)) {
  16.  
  17. // wind_speed_average....................................
  18. if($wynik_id == $r['ID']) {
  19. $wynik_docelowy = $r['wind_speed_average'];
  20. $id_docelowy = $r['ID'];
  21. }
  22. if($wynik_id-1 == $r['ID']) {
  23. $wynik_docelowy1 = $r['wind_speed_average'];
  24. $id_docelowy1 = $r['ID'];
  25. }
  26. if($wynik_id-2 == $r['ID']) {
  27. $wynik_docelowy2 = $r['wind_speed_average'];
  28. $id_docelowy2 = $r['ID'];
  29. }
  30.  
  31. // windgust...............................................
  32. if($wynik_id == $r['ID']) {
  33. $wynik_sr_docelowy = $r['windgust'];
  34. }
  35. if($wynik_id-1 == $r['ID']) {
  36. $wynik_sr_docelowy1 = $r['windgust'];
  37. }
  38. if($wynik_id-2 == $r['ID']) {
  39. $wynik_sr_docelowy2 = $r['windgust'];
  40. }
  41.  
  42. // wind_direction_average.................................
  43. if($wynik_id == $r['ID']) {
  44. $wynik_sr_dir_docelowy = $r['wind_direction_average'];
  45. }
  46. if($wynik_id-1 == $r['ID']) {
  47. $wynik_sr_dir_docelowy1 = $r['wind_direction_average'];
  48. }
  49. if($wynik_id-2 == $r['ID']) {
  50. $wynik_sr_dir_docelowy2 = $r['wind_direction_average'];
  51. }
  52.  
  53. // compass ...............................................
  54. if($wynik_id == $r['ID']) {
  55. $wynik_sr_com_docelowy = $r['compass'];
  56. }
  57. if($wynik_id-1 == $r['ID']) {
  58. $wynik_sr_com_docelowy1 = $r['compass'];
  59. }
  60. if($wynik_id-2 == $r['ID']) {
  61. $wynik_sr_com_docelowy2 = $r['compass'];
  62. }
  63. }
  64. }
  65.  
  66. if($wynik_docelowy > 0 && $wynik_docelowy1 == 0 && $wynik_docelowy2 > 0){
  67.  
  68. $wynik_docelowy1 = ($wynik_docelowy + $wynik_docelowy2)/2;
  69. $wynik_sr_docelowy1 = ($wynik_sr_docelowy + $wynik_sr_docelowy2)/2;
  70. $wynik_sr_dir_docelowy1 = $wynik_sr_dir_docelowy2;
  71. $wynik_sr_com_docelowy1 = $wynik_sr_com_docelowy2;
  72.  
  73. $wynik = mysql_query("UPDATE tab_czujniki_2 SET wind_speed_average='$wynik_docelowy1', windgust='$wynik_sr_docelowy1', wind_events='1', wind_direction_average='$wynik_sr_dir_docelowy1', compass='$wynik_sr_com_docelowy1' WHERE id='$id_docelowy1'");
  74. }

Pozdrawiam
Pyton_000
1. nie uzywaj mysql_*. Pokazalem Ci przykład z PDO.
2. Sprawdzanie "$wynik_id-1" jest błędne bo co jak będziesz miał ID 6, 8, 11 questionmark.gif

Tak nie bardzo rozumiem po co te 1-sze zapytanie wyciągające ID.

Weź sobie mój kod i dopisz tylko wyliczanie pozostałych wartości i zapisanie zaktualizowanie ich.
Tomplus
@Python
On pobiera ID, a potem tworzy 3 zmienne z wynikami, gdzie jeden odpowiada znalezionemu, kolejne to poprzednie wyniki.
Dlatego jak ma ID = 10, to drugie zapytanie da mu rekordy z ID 10, 9 i 8.

@Zbysiu
Dlatego lepiej zamiast tych 15 IF zrobić, 3 CASE'y?

  1. switch($r['ID']) {
  2. case ($wynik_id):
  3. $wynik_docelowy = $r['wind_speed_average'];
  4. $wynik_sr_docelowy = $r['windgust'];
  5. $wynik_sr_dir_docelowy = $r['wind_direction_average'];
  6. $wynik_sr_com_docelowy = $r['compass'];
  7. $id_docelowy = $r['ID'];
  8. break;
  9.  
  10. case ($wynik_id-1):
  11. $wynik_docelowy1 = $r['wind_speed_average'];
  12. $wynik_sr_docelowy1 = $r['windgust'];
  13. $wynik_sr_dir_docelowy1 = $r['wind_direction_average'];
  14. $wynik_sr_com_docelowy1 = $r['compass'];
  15. $id_docelowy1 = $r['ID'];
  16. break;
  17.  
  18. case ($wynik_id-2):
  19. $wynik_docelowy2 = $r['wind_speed_average'];
  20. $wynik_sr_docelowy2 = $r['windgust'];
  21. $wynik_sr_dir_docelowy2 = $r['wind_direction_average'];
  22. $wynik_sr_com_docelowy2 = $r['compass'];
  23. $id_docelowy2 = $r['ID'];
  24. break;
  25. }


Pyton_000
Tomplus nie da jeśli będzie dziura w numeracji ID.
Tomplus
Masz rację. Zauważyłem ten mankament, ale przyjmuje że dostarcza pełny wypis danych z JSONa który pokazywał kolega kilka miesięcy temu.
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.