Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Pobieranie wyników z kilku tabel i sortowanie ich.
Forum PHP.pl > Forum > Przedszkole
brzanek
Witam mam problem z pobraniem danych z kilku tabel.
Mam 3 tabele




Do każdej z nich dodawane są nowe rekordy z warunkami pogodowymi co 5 minut.
Chciałbym pobrać dane z tych tabel a konkretnie wartości w tempmax ale dla danego dnia. Chcę aby wyniki były wyświetlone od najwyższej temperatury dnia 03.08.2015 do najniższej tego dnia. Muszą też pojawić się nazwy miejscowości oraz data np:

DZIEŃ MIEJSCOWOŚĆ TEMPERATURA
03.08.2015 Choszczno 32*C
03.08.2015 Drawsko 31*C
03.08.2015 Koszalin 30*C
Proszę o pomoc z góry dziękuję i pozdrawiam.
bobek358
Tabele mają taką samą strukturę. Wystarcz zastosować zapytanie SQL z UNION:

  1. (SELECT CONCAT('choszczno'), MAX(tempmax) FROM xxxxx_choszczno WHERE dzien LIKE 'xxxx-xx-xx%')
  2. UNION
  3. (SELECT CONCAT('koszalin'), MAX(tempmax) FROM xxxxx_koszalin WHERE dzien LIKE 'xxxx-xx-xx%')
  4. UNION
  5. (SELECT CONCAT('drawsko'), MAX(tempmax) FROM xxxxx_drawsko WHERE dzien LIKE 'xxxx-xx-xx%')
brzanek
Jesteś pewien że podane przez ciebie rozwiązanie zadziała? Próbuję to wywołać przez php ale nie wychodzi.
  1. <?php
  2. require_once "../maincore.php";
  3. require_once THEMES."templates/header.php";
  4. // podłączamy plik connection.php
  5. require "connection1.php";
  6. // wywołujemy funkcję connection()
  7. connection();
  8.  
  9.  
  10. echo '<hr>';
  11. echo '<h3>Rekordy pomiarów</h3>';
  12. echo '<p>Strona odświerzana jest raz na dobę w godzinach 00:00 - 01:00. W tym czasie spływają dane ze stacji pogodowych, trwa zapisywanie wyników w naszej bazie danych a następnie przekazywane na stronę.
  13. W tej chwili dane spływają z kilkunastu miast naszego województwa. Rekardy mierzone są od 18.06.2015 roku.</p>';
  14. echo '<hr>';
  15. echo '<div class="row">';
  16.  
  17. $query = " (SELECT CONCAT('choszczno'), MAX(tempmax) FROM fusionee445_warunki_choszczno WHERE dzien LIKE '2015-08-03 %')
  18. UNION
  19. (SELECT CONCAT('koszalin'), MAX(tempmax) FROM fusionee445_warunki_koszalin WHERE dzien LIKE '2015-08-03 %')
  20. UNION
  21. (SELECT CONCAT('drawsko'), MAX(tempmax) FROM fusionee445_warunki_drawsko WHERE dzien LIKE '2015-08-03 %') DESC LIMIT 15";
  22. $result = mysql_query($query) or die(mysql_error());
  23. $miejsce = 1;
  24. echo '<div class="col-md-4">';
  25. echo '<h4>Najwyższe temperatury</h4>';
  26. echo '<p>Temperatura mierzona jest na wysokości 2m w cieniu. Wynik to najwyższa temperatura w ciągu dnia.</p>';
  27. echo '<table class="table table-hover">
  28. <thead>
  29. <tr>
  30. <th>#</th>
  31. <th>Temperatura</th>
  32. <th>Miejscowość</th>
  33. <th>Data</th>
  34. </tr>
  35. </thead>
  36. <tbody>';
  37. while($row = mysql_fetch_array($result)){
  38. echo "<tr>
  39. <th scope='row'>test</th>";
  40. echo "<td>".$row['tempmax']."&deg;C</td>";
  41. //echo "<td>".$row['title']."</td>";
  42. //echo "<td>".$row['history_day']."</td>";
  43. echo '</tr>';
  44. }
  45. echo '</tbody>
  46. </table>';
  47. echo '</div>';
  48.  
  49. echo '</div>';
  50.  
  51.  
  52. //$sql = "SELECT * FROM wea_history WHERE history_day LIKE \'2015-07-18\'";
  53.  
  54.  
  55. require_once THEMES."templates/footer.php";
  56. ?>
bobek358
No a co to za bubel:

  1. .... DESC LIMIT 15


Jeśli chcesz sortować to zrób tak:

  1. (SELECT CONCAT('choszczno'), MAX(tempmax) AS max FROM fusionee445_warunki_choszczno WHERE dzien LIKE '2015-08-03 %')
  2. UNION
  3. (SELECT CONCAT('koszalin'), MAX(tempmax) AS max FROM fusionee445_warunki_koszalin WHERE dzien LIKE '2015-08-03 %')
  4. UNION
  5. (SELECT CONCAT('drawsko'), MAX(tempmax) AS max FROM fusionee445_warunki_drawsko WHERE dzien LIKE '2015-08-03 %') ORDER BY max DESC LIMIT 15
brzanek
Zapytanie nie zwraca błędów ale i nie pokazuje też wyników.
  1. <?php
  2. require_once "../maincore.php";
  3. require_once THEMES."templates/header.php";
  4. // podłączamy plik connection.php
  5. require "connection1.php";
  6. // wywołujemy funkcję connection()
  7. connection();
  8.  
  9.  
  10. echo '<hr>';
  11. echo '<h3>Rekordy pomiarów</h3>';
  12. echo '<p>Strona odświerzana jest raz na dobę w godzinach 00:00 - 01:00. W tym czasie spływają dane ze stacji pogodowych, trwa zapisywanie wyników w naszej bazie danych a następnie przekazywane na stronę.
  13. W tej chwili dane spływają z kilkunastu miast naszego województwa. Rekardy mierzone są od 18.06.2015 roku.</p>';
  14. echo '<hr>';
  15. echo '<div class="row">';
  16.  
  17. $query = " (SELECT CONCAT('choszczno'), MAX(tempmax) AS max FROM fusionee445_warunki_choszczno WHERE dzien LIKE '2015-08-03 %')
  18. UNION
  19. (SELECT CONCAT('koszalin'), MAX(tempmax) AS max FROM fusionee445_warunki_koszalin WHERE dzien LIKE '2015-08-03 %')
  20. UNION
  21. (SELECT CONCAT('drawsko'), MAX(tempmax) AS max FROM fusionee445_warunki_drawsko WHERE dzien LIKE '2015-08-03 %') ORDER BY max DESC LIMIT 15";
  22. $result = mysql_query($query) or die(mysql_error());
  23. $miejsce = 1;
  24. echo '<div class="col-md-4">';
  25. echo '<h4>Najwyższe temperatury</h4>';
  26. echo '<p>Temperatura mierzona jest na wysokości 2m w cieniu. Wynik to najwyższa temperatura w ciągu dnia.</p>';
  27. echo '<table class="table table-hover">
  28. <thead>
  29. <tr>
  30. <th>#</th>
  31. <th>Temperatura</th>
  32. <th>Miejscowość</th>
  33. <th>Data</th>
  34. </tr>
  35. </thead>
  36. <tbody>';
  37. while($row = mysql_fetch_array($result)){
  38. echo "<tr>
  39. <th scope='row'>test</th>";
  40. echo "<td>".$row['tempmax']."&deg;C</td>";
  41. //echo "<td>".$row['title']."</td>";
  42. //echo "<td>".$row['history_day']."</td>";
  43. echo '</tr>';
  44. }
  45. echo '</tbody>
  46. </table>';
  47. echo '</div>';
  48.  
  49. echo '</div>';
  50.  
  51.  
  52. //$sql = "SELECT * FROM wea_history WHERE history_day LIKE \'2015-07-18\'";
  53.  
  54.  
  55. require_once THEMES."templates/footer.php";
  56. ?>
bobek358
Bo nie
  1. ".$row['tempmax']."

a
  1. ".$row['max']."
lub
  1. ".$row[1]."


Ogólnie gdy odwołujesz się do funkcji w MySQL to kolumna nie nazywa się domyślnie, a trzeba jej nadać nazwę przez AS lub odwołać się po indeksie numerowanym od 0.
trueblue
CONCAT jest niepotrzebny, również LIMIT (bo i tak będą 3 rekordy w wyniku).
Zamiast LIKE proponuję:
  1. WHERE DATE(dzien)=CURDATE() /* jeśli dziś */
  2. WHERE DATE(dzien)='2015-01-01' /* jeśli dowolna data */
bobek358
Co do daty to ok, ale concat bym zostawił bo tak od razu w $row[0] ma nazwę miasta i nie musi się tym martwić na etapie wyświetlania.
trueblue
To zauważ, że bez CONCAT również będzie mieć nazwę miasta. Ta funkcja jest tu zbyteczna.
bobek358
A w jaki sposób bo nie do końca rozumiem, zawsze używałem concata
nospor
Zamiast
SELECT CONCAT('choszczno'),
robisz
SELECT 'choszczno',
bobek358
Ok nie zwróciłem nigdy uwagi ze to zadziała - dzięki smile.gif
brzanek
Super wielkie dzięki działa.
A można do tego zrobić jakiś select z możliwością podania daty i wyświetlenia najwyższych temperatur dla wybranego dnia?
bobek358
Oczywiście - dodaj sobie formularz i do pola select załaduj daty jakie masz w bazie, użyj DISTINCT aby nie dublować dat.
Później jak masz już dane w $_POST to dodaj do zapytania taką zmianę

  1. (SELECT 'choszczno', MAX(tempmax) AS max FROM fusionee445_warunki_choszczno WHERE dzien LIKE '".$_POST['DATA']." %')
  2. UNION
  3. (SELECT 'koszalin', MAX(tempmax) AS max FROM fusionee445_warunki_koszalin WHERE dzien LIKE '".$_POST['DATA']." %')
  4. UNION
  5. (SELECT 'drawsko', MAX(tempmax) AS max FROM fusionee445_warunki_drawsko WHERE dzien LIKE '".$_POST['DATA']." %') ORDER BY max DESC


Oczywiście nie zapomnij o filtrowaniu danych z formularza w razie w.
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.