Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zmiana pojedynczych rekordów w bazie MySQL wg szczególnego algorytmu
zbysiusp
post
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
maly_swd
post
Post #2





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


No to pochwal się co już zrobiłeś (IMG:style_emoticons/default/smile.gif)

Przecież to parę ifów.
Go to the top of the page
+Quote Post
zbysiusp
post
Post #3





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

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


Cytat(maly_swd @ 13.02.2017, 11:06:38 ) *
No to pochwal się co już zrobiłeś (IMG:style_emoticons/default/smile.gif)

Przecież to parę ifów.


Problem rozwiązany. Algorytm działa jak należy. Mam 15 if-ów (IMG:style_emoticons/default/biggrin.gif)

Dziękuję za zainteresowanie.
Go to the top of the page
+Quote Post
maly_swd
post
Post #4





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


A więc pochwal się.
Inni może coś się nauczą (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
zbysiusp
post
Post #5





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

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


Cytat(maly_swd @ 13.02.2017, 17:03:44 ) *
A więc pochwal się.
Inni może coś się nauczą (IMG:style_emoticons/default/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.
(IMG:style_emoticons/default/biggrin.gif)
Pozdrawiam
Go to the top of the page
+Quote Post
maly_swd
post
Post #6





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


Pokaż kod.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Cytat(zbysiusp @ 13.02.2017, 13:23:58 ) *
Problem rozwiązany. Algorytm działa jak należy. Mam 15 if-ów (IMG:style_emoticons/default/biggrin.gif)

Dziękuję za zainteresowanie.


15 IF-ów ? (IMG:style_emoticons/default/dostal.gif) (IMG:style_emoticons/default/worriedsmiley.gif) (IMG:style_emoticons/default/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. }


Ten post edytował Pyton_000 15.02.2017, 09:51:41
Go to the top of the page
+Quote Post
zbysiusp
post
Post #8





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

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


Cytat(Pyton_000 @ 15.02.2017, 09:49:43 ) *


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





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
Tomplus
post
Post #10





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

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


@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. }


Go to the top of the page
+Quote Post
Pyton_000
post
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Tomplus nie da jeśli będzie dziura w numeracji ID.
Go to the top of the page
+Quote Post
Tomplus
post
Post #12





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

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


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.
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: 23.08.2025 - 04:43