Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Pobieranie rekordów w wyznaczonym przedziale
brzanek
post 1.10.2018, 11:48:59
Post #1





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


Witam pobieram dane z bazy danych które są w przedziale od wczorajszego dnia od godziny 20:00 do dzisiejszego dnia do godziny 07:00
Mam takie zapytanie.
  1. $start = '20:00';
  2. $koniec = '06:00';
  3. $dzienwczorajszy = date('Y.m.d', strtotime("-1 day"));
  4. $koniecd = "".date("Y.m.d")."";
  5.  
  6. $result = $mysqli->query("SELECT * FROM dane WHERE godzina BETWEEN '".$start."' AND '".$koniec."' AND czas BETWEEN '".$dzienwczorajszy."' AND '".$koniecd."' AND id_miasto=1 ORDER BY temp DESC LIMIT 10");
  7. while ( $row = mysqli_fetch_array($result) ) {
  8. echo "<div><p>".$row['temp']."</p><br></div>";
  9. }

W bazie danych mam kolumny godzina w formie YYYY.MM.DD i czas w formie HH:MM ale to zapytanie nie zwraca mi wyników.
Go to the top of the page
+Quote Post
nospor
post 1.10.2018, 12:11:49
Post #2





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




1) Czemu dnia i godziny nie trzymasz w jednym polu typu DATETIME tylko rozbijasz to bez wiekszego sensu na dwa pola?
2) Po formacie po jakim szukasz odnosze wrazenie ze zarowno dzien jak i godzina nie sa w ogole typu czasowego tylko to sa w bazie pola TEXT/VARCHAR - no nic dziwnego ze nie dziala...

ps:
nie $koniecd = "".date("Y.m.d")."";
a: $koniecd = date("Y.m.d");
Juz moglbys wiedziec ze dodawanie pustych tekstow nic nie wnosi.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
brzanek
post 2.10.2018, 06:19:19
Post #3





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


Dobra zmieniłem to trochę. Dodałem do bazy danych kolumnę z DATETIME
Mam teraz takie zapytanie
  1. $dzienwczorajszy = date('Y-m-d 20:00:00.000000', strtotime("-1 day"));
  2. $koniecdt = date("Y-m-d 07:00:00.000000");
  3. $result = $mysqli->query("
  4. SELECT CONCAT('Darłowo'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=1
  5. UNION
  6. SELECT CONCAT('Świnoujście'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=2
  7. UNION
  8. SELECT CONCAT('Gorzów Wielkopolski'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=3
  9. UNION
  10. SELECT CONCAT('Kołobrzeg'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=4
  11. UNION
  12. SELECT CONCAT('Koszalin'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=6
  13. UNION
  14. SELECT CONCAT('Trzebież'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=8
  15. UNION
  16. SELECT CONCAT('Resko'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=9
  17. UNION
  18. SELECT CONCAT('Miastko'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=12
  19. UNION
  20. SELECT CONCAT('Szczecinek'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=15
  21. UNION
  22. SELECT CONCAT('Wierzchowo'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=17
  23. UNION
  24. SELECT CONCAT('Szczecin'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=19
  25. UNION
  26. SELECT CONCAT('Trzcińsko'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=21
  27. UNION
  28. SELECT CONCAT('Przelewice'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=22
  29. UNION
  30. SELECT CONCAT('Piła'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=23
  31. UNION
  32. SELECT CONCAT('Krzyż'), MIN(wiatrmax) AS min, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND id_miasto=24
  33. ORDER BY min DESC LIMIT 15");

Powinno pokazać rekodry z przedziału od wczorajszego dnia od godziny 20:00 do dzisiejszego dnia do godziny 07:00 ale pojawiają się tylko rekordy z godziny 20:00
Jak daję takie zapytanie
  1. $dzienwczorajszy = date('Y-m-d 20:00:00.000000', strtotime("-1 day"));
  2. $koniecdt = date("Y-m-d 07:00:00.000000");
  3. $result = $mysqli->query("
  4. SELECT * FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' ORDER BY dane.wiatrmax DESC ORDER BY min DESC LIMIT 15");

To pojawiają się rekordy wyznaczone ale powtarza się id_miasto.
Jak mogę wykluczyć powtarzanie się tych samych id_miasto?
Go to the top of the page
+Quote Post
nospor
post 2.10.2018, 09:14:36
Post #4





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Dodajesz
GROUP BY id_miasto
i po sprawie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
brzanek
post 2.10.2018, 09:38:10
Post #5





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


Coś nie działa dodałem co podałeś ale nic się nie wyświetla.
  1. $dzienwczorajszy = date('Y-m-d 20:00:00.000000', strtotime("-1 day"));
  2. $koniecdt = date("Y-m-d 07:00:00.000000");
  3. $result = $mysqli->query("
  4. SELECT * FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' GROUP BY id_miasto ORDER BY dane.wiatrmax DESC LIMIT 15");
Go to the top of the page
+Quote Post
nospor
post 2.10.2018, 09:50:05
Post #6





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




1) Nigdzie nie widze kodu do wyswietlania wiec jakim cudem ma sie cos wyswietlac?
2) Dodaj MIN do sekcje przed FROM. Zdaje sie chciales miec MIN tam, co nie?
3) Wywal ten LIMIT


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
brzanek
post 2.10.2018, 10:08:40
Post #7





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


Limit muszę dodać bo w bazie też są zerowe wartości których nie chcę wyświetlić.
Jak dodam MIN(wiatrmax) AS min to będę mógł wyświetlić tylko te dane czyli.
  1. $dzienwczorajszy = date('Y-m-d 20:00:00.000000', strtotime("-1 day"));
  2. $koniecdt = date("Y-m-d 07:00:00.000000");
  3. $result = $mysqli->query("SELECT MIN(wiatrmax) AS min FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' GROUP BY id_miasto ORDER BY dane.wiatrmax DESC LIMIT 15");

Kod do wyświetlenia
  1. $result = $mysqli->query("SELECT * FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' ORDER BY wiatrmax DESC LIMIT 15");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. echo "<tr>";
  4. echo "<td><span class='label label-success'>".$row['wiatrmax']." km/h</span></td>";
  5. echo "<td>".$row['miasto']."</td>";
  6. echo "<td>".$row['godzina']."</td>";
  7. echo '</tr>';
  8. }
Go to the top of the page
+Quote Post
nospor
post 2.10.2018, 10:18:26
Post #8





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
Limit muszę dodać bo w bazie też są zerowe wartości których nie chcę wyświetlić.

Limitem nie ogranicza sie jakis zerowych rekordow... kurcze :/
Wywal ten limit. Group by pogrupuje ci dane, MIN, wyswietli ci najmniejsza wartosc. A jak chcesz jeszcze cos wiecej niz MIN to dodaj tez to do tej sekcji obok MIN.
A jak bardzo chcesz wywpieprzyc jakies zerowe wartosci to ma to byc w WHERE a nie LIMIT.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
brzanek
post 2.10.2018, 10:31:51
Post #9





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


Dobra zrobiłem tak
  1. $dzienwczorajszy = date('Y-m-d 20:00:00.000000', strtotime("-1 day"));
  2. $koniecdt = date("Y-m-d 07:00:00.000000");
  3.  
  4. $result = $mysqli->query("SELECT MAX(wiatrmax) AS max, miasto, godzina FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' GROUP BY id_miasto ORDER BY dane.wiatrmax DESC");
  5. while ( $row = mysqli_fetch_array($result) ) {
  6. echo "<tr>";
  7. echo "<th scope='row'>".$miejsce++."</th>";
  8. echo "<td><span class='label label-success'>".$row['max']." km/h</span></td>";
  9. echo "<td>".$row['miasto']."</td>";
  10. echo "<td>".$row['godzina']."</td>";
  11. echo '</tr>';
  12. }

Zamiast odpowiedniej godziny mam wszędzie 20:00.
Go to the top of the page
+Quote Post
nospor
post 2.10.2018, 10:35:25
Post #10





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Bo uzylismy GROUP BY. Przeciez chciales miec pogrupowane dane dla danego miasta wiec logiczne ze dla danego miasta nie bedziesz juz mial listy godzin, tylko jeden rekord z jedna losowa godzina + max + nazwe miasta.
Musisz sie zdecydowac co chcesz. Czy chcesz miec liste godzin czy moze jednak max


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
brzanek
post 2.10.2018, 10:47:01
Post #11





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


ok pominę już tą godzinę ale powiedz mi jeszcze jak uporządkować to teraz od najwyższej wartości do najniższej. zmiana ORDER BY dane.wiatrmax DESC na ORDER BY dane.wiatrmax ASC nic nie daje.
Go to the top of the page
+Quote Post
nospor
post 2.10.2018, 10:56:06
Post #12





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




To zapytanie co masz teraz dajesz jako podzapytanie a w zapytaniu glownym sortujesz po tej dacie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
brzanek
post 2.10.2018, 11:13:27
Post #13





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


Już teraz nic nie kumam
  1. $dzienwczorajszy = date('Y-m-d 20:00:00.000000', strtotime("-1 day"));
  2. $koniecdt = date("Y-m-d 07:00:00.000000");
  3. $result = $mysqli->query("SELECT MAX(wiatrmax) AS max, miasto FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND wiatrmax != 0.0 GROUP BY id_miasto ORDER BY dane.wiatrmax DESC");
  4. while ( $row = mysqli_fetch_array($result) ) {
  5. echo "<tr>";
  6. echo "<th scope='row'>".$miejsce++."</th>";
  7. echo "<td><span class='label label-success'>".$row['max']." km/h</span></td>";
  8. echo "<td>".$row['miasto']."</td>";
  9. echo '</tr>';
  10. }

Da się to uporządkować czy nie?

Dobra mam
  1. $result = $mysqli->query("SELECT MAX(wiatrmax) AS max, miasto FROM dane WHERE dataczas BETWEEN '".$dzienwczorajszy."' AND '".$koniecdt."' AND wiatrmax != 0.0 GROUP BY id_miasto ORDER BY max DESC");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. echo "<tr>";
  4. echo "<th scope='row'>".$miejsce++."</th>";
  5. echo "<td><span class='label label-success'>".$row['max']." km/h</span></td>";
  6. echo "<td>".$row['miasto']."</td>";
  7. echo '</tr>';
  8. }

Dzięki za pomoc.
Go to the top of the page
+Quote Post

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: 19.04.2024 - 08:03