Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie danych w kilku tabelach
Forum PHP.pl > Forum > Bazy danych > MySQL
wachcio
Witam

Mam urządzenie ("pogodynkę") na Raspberry Pi które odczytuje dane z kilku czujników i zapisuje je do swojej bazy danych oraz kopię na zewnętrznym serwerze MySQL. Dodatkowo w innym miejscu będę zakładał inne urządzenie które będzie również z tą zewnętrzną bazą współpracować zapisując do niej dane z innych czujników. Kolumny i tabele mam już narzucone przez Raspberry Pi i są to: ID, time i value a nazwą tabeli jest nazwa czujnika. Chciałem dane z RPi i w przyszłości z nowego urządzenia przedstawić na jednej stronie jednak mam problem:

  1. //MySQL
  2. $host = 'localhost'; // Serwer bazy danych
  3.  
  4. $user = 'user'; // Nazwa uzytkownika
  5. $password = 'pass!'; // Haslo
  6. $database = 'db'; // Nazwa bazy danych
  7.  
  8. // POLACZ Z BAZA DANYCH
  9. ini_set("display_errors", 0);
  10. $polaczenie = @new mysqli($host, $user, $password, $database);
  11. if ($polaczenie->connect_errno!=0)
  12. {
  13. echo "Error: ".$polaczenie->connect_errno;
  14. }
  15. else
  16. {
  17. mysqli_query($polaczenie, "SET CHARSET utf8");
  18. mysqli_query($polaczenie, "SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");
  19. mysqli_select_db($polaczenie, $database);
  20.  
  21. $temp_raspberry_pi = @$polaczenie->query ("SELECT * FROM `Raspberry_Pi` ORDER BY `Raspberry_Pi`.`time` DESC ");
  22. $temp_raspberry_pi = $temp_raspberry_pi->fetch_assoc();
  23.  
  24. $temp_kot_pomieszczenie = @$polaczenie->query ("SELECT * FROM `28-0000062b6be2` ORDER BY `28-0000062b6be2`.`time` DESC ");
  25. $temp_kot_pomieszczenie = $temp_kot_pomieszczenie->fetch_assoc();
  26.  
  27. echo('<p><b>Raspberry Pi: czas odczytu ');
  28. echo $temp_raspberry_pi['time'];
  29. echo (', '.$temp_raspberry_pi['value']. ' <sup>o</sup>C');
  30. echo ('<li>'.$temp_ico.'Kotłownia pomieszczenie: '.$temp_kot_pomieszczenie['value']. ' <sup>o</sup>C');
  31.  
  32. }


Jeśli chcę uzyskać tylko jeden rekord z jednej tabeli to wszystko jest ok ale jeśli kilka z kilku tabel to dane nie są wyświetlane. Co robię nie tak?
viking
Na pewno masz na myśli tabele a nie wiersze? Dodatkowo poczytaj note http://php.net/manual/en/mysqli.set-charset.php
wachcio
Każdy czujnik to oddzielna tabela z kolumnami Id (numer odczytu), Time (data i czas odczytu) oraz value (wartość odczytu)
viking
To jeśli dobrze rozumiem potrzebny ci po prostu UNION.
wachcio
W PHPMyAdmin dałem:

  1. SELECT value, TIME
  2. FROM `28-0000062ac124`
  3. UNION
  4. SELECT value, TIME
  5. FROM `28-0000062b6be2`
  6. UNION
  7. SELECT value, TIME
  8. FROM `28-0000062b68cc`
  9.  
  10. ORDER BY `time` DESC
  11. LIMIT 3


value TIME
25.1 2016-11-29 18:27:17
29.4 2016-11-29 18:27:17
20.4 2016-11-29 18:27:17


Wyświetliło mi ostatnie wartości ale nie wiem która do jakiej tabeli należy... Więc nic mi to nie daje.
trueblue
To dodaj sobie na liście wybieranych pól nazwę tabeli.
Pyton_000
A dlaczego nie możesz trzymać tego w 1 tabeli i dodać tylko kolumnę z nazwą czujnika?
wachcio
trueblue a mógłbyś napisać jak? Dopiero raczkuję w temacie baz danych... Nie wiem za bardzo jak użyć SHOW TABLES w połączeniu z moim zapytaniem

Pyton_000 dlatego, że to jest baza danych z już istniejącego systemu o nazwie Nettemp i tak właśnie sobie wymyślili jego twórcy...
trueblue
Akurat tu SHOW TABLES, nie jest do niczego potrzebne.
Przecież wiesz z jakiej tabeli wybierasz.

  1. SELECT value, TIME, '28-0000062ac124' AS tabela
  2. FROM `28-0000062ac124`
  3. UNION
  4. ...
wachcio
Wiem z jakich tabel pobieram dane ale później już nie wiem z jakiej tabeli jest konkretna wartość.
viking
Trueblue już ci napisał jak masz to zrobić. W select nie musisz tylko wartości kolumn podawać ale mogą być to dowolne obliczenia albo nawet dowolna wartość.
Pyton_000
No to bieda faktycznie smile.gif
wachcio
Dałem:

  1. SELECT value, TIME, '28-0000062ac124' AS tabela
  2. FROM `28-0000062ac124`
  3. UNION
  4. SELECT value, TIME, '28-0000062b6be2'
  5. FROM `28-0000062b6be2`
  6. UNION
  7. SELECT value, TIME, '28-0000062b68cc'
  8. FROM `28-0000062b68cc`
  9. UNION
  10. SELECT value, TIME, '28-0000062b77b6'
  11. FROM `28-0000062b77b6`
  12. UNION
  13. SELECT value, TIME, '28-0000062bbaf9'
  14. FROM `28-0000062bbaf9`
  15. UNION
  16. SELECT value, TIME, '28-031467987aff'
  17. FROM `28-031467987aff`
  18. UNION
  19. SELECT value, TIME, 'gpio_20_humid'
  20. FROM `gpio_20_humid`
  21. UNION
  22. SELECT value, TIME, 'gpio_20_temp'
  23. FROM `gpio_20_temp`
  24. UNION
  25. SELECT value, TIME, 'gpio_21_humid'
  26. FROM `gpio_21_humid`
  27. UNION
  28. SELECT value, TIME, 'gpio_21_temp'
  29. FROM `gpio_21_temp`
  30. UNION
  31. SELECT value, TIME, 'Raspberry_Pi'
  32. FROM `Raspberry_Pi`
  33. ORDER BY `time` DESC
  34. LIMIT 11


Uzyskałem:
value TIME tabela
40.1 2016-11-29 19:22:16 Raspberry_Pi
54.2 2016-11-29 19:22:16 28-031467987aff
25.1 2016-11-29 19:22:16 28-0000062b68cc
1.4 2016-11-29 19:22:16 gpio_20_temp
20.5 2016-11-29 19:22:16 28-0000062ac124
1.4 2016-11-29 19:22:16 gpio_21_temp
58.9 2016-11-29 19:22:16 28-0000062bbaf9
29.8 2016-11-29 19:22:16 28-0000062b6be2
54.6 2016-11-29 19:22:16 28-0000062b77b6
99.9 2016-11-29 19:22:16 gpio_20_humid
99.9 2016-11-29 19:22:16 gpio_21_humid

Jak teraz odwołać się do tych wyników z PHP abym mógł jakoś sensownie wyświetlić je?
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.