Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobranie najnowyszch wyników
Forum PHP.pl > Forum > Bazy danych > MySQL
matisq
Mam tabele z takimi kolumnami:

time (timestamp unixowy (123456789))
host_name (nazwa hosta)
srv_dsc (opis servisu)
srv_output (output servisu)

Mam kilka hostów i kilka serwisów. każdy wpis do bazy danych jest unikalny (timestamb, host_name, srv_dsc).
Próbuję wymyślić takie zapytanie żeby dla danego hosta pobrać tylko najnowsze wpisy dotyczące każdego z serwisów, czyli jeśli mam 5 serwisów to jako rezultat dostaję 5 lini itp.

Próbowałem tego ale jakoś wątpie że to zadziała.
  1. SELECT *, MAX(time)
  2. FROM DATA WHERE host_name = "jakis-host"
  3. GROUP BY srv_dsc


Jakieś sugestie?
Dzięki za przeczytanie
sowiq
  1. ORDER BY time DESC
?
kefirek
Coś z ten desen
  1. <?php
  2. $wynik = mysql_query("SELECT host_name FROM data GROUP BY host_name");
  3. while($r = mysql_fetch_assoc($wynik)) {
  4.  
  5. echo "<b>".$r['host_name']."</b><br>";
  6.  
  7. $wynik1 = mysql_query("SELECT * FROM data WHERE host_name='".$r['host_name']."' ORDER BY time DESC LIMIT 5");
  8.  
  9. while ($r2 = mysql_fetch_assoc($wynik1)) {
  10.  
  11. echo "".$r2['srv_dsc']."<br>";
  12.  
  13. }
  14. }
  15. ?>


Wyświetlasz nazwy hostów i do kazdego po 5 najnowszych opisów
matisq
Dzięki smile.gif Tego mi właśnie trzeba było!

A jednak nie

  1. SELECT * , MAX( time )
  2. FROM service_data WHERE host_name = "jakis-host"
  3. GROUP BY srv_dsc
  4. ORDER BY srv_dsc ASC



time: 1232090415 czyli (Fri, 16 Jan 2009 07:20:15 UTC)
host_name: host
srv_dsc: opis serwisu
srv_out: wynik serwisu
MAX( time ): 1232093703 czyli (Fri, 16 Jan 2009 08:15:03 UTC)

Chciałem uzyskać najnowsze wyniki z tabeli dla danego hosta a tu jakieśtam inne wyszły

Jakiś pomysł?
sowiq
  1. SELECT *
  2. FROM service_data WHERE host_name = "jakis-host"
  3. ORDER BY time DESC
magra
  1. SELECT *
  2. FROM `data` WHERE `host_name` = "jakis-host"
  3. GROUP BY `srv_dsc`
  4. ORDER BY `time` DESC
matisq
Ale te zapytania nei wybierająmi najnowszych wpisów? Dlaczego?

Mam jakieś 100 nowych wpisów do bazy co minute. I mam nowsze wpisy. Sprawdzam MAX(time) i porównuje z tym co uzyskałem i mam różnice. A powinno wyświetlić najnowsze wpisy!
Dostaje 1232090415 (Fri, 16 Jan 2009 07:20:15 UTC) a w bazie jest juz 1232099974 (Fri, 16 Jan 2009 09:59:34 UTC)

magra
sotruj po timet, a nie po service_description!!!
matisq
ale chce wyniki miec zwrócone tak zebym miał je posortowane po nazwie serwisu! A pozatym jak zmieniam zapoytanie i tak dostaje te same wyniki smile.gif Znaczy z 7:20
sowiq
Cytat(matisq @ 16.01.2009, 13:07:22 ) *
ale chce wyniki miec zwrócone tak zebym miał je posortowane po nazwie serwisu!
No to albo sortujesz po nazwie serwisu (wtedy nie będą posortowane po czasie), albo sortujesz po czasie (wtedy najnowsze będą na początku/końcu).

Jeśli chcesz wybrać po 5 najnowszych wpisów z każdego serwisu, to musisz zastosować pętlę w PHP (napisał Ci o tym kefirek w drugim poście). W innym wypadku możesz wybrać najnowsze z tabeli, ale z różnych serwisów, lub najnowsze z danego serwisu, ale nie koniecznie będą to najnowsze w całej tabeli.
matisq
Jeszcze raz.
Mam taką ogromniastą tabele z milionem wpisów (100 wpisów/sek). Chcę stworzyć zapytanie które dla każdego hosta (w tabeli jest ich 70) w wynikuda mi najnowszy (najwyzszy numer timet) pojedynczy wpis dotyczacy każdego z serwisów (a jest ich powiedzmy 5).
sowiq
Cytat(magra @ 16.01.2009, 11:19:01 ) *
  1. SELECT *
  2. FROM `data` WHERE `host_name` = "jakis-host"
  3. GROUP BY `srv_dsc`
  4. ORDER BY `time` DESC


Tu masz dobrze napisane. Musisz zmienić tylko jedną rzecz (a dokładnie usunąć cały warunek WHERE). Jakby chciało Ci się popróbować samemu, to już dawno byś do tego doszedł sam.


[edit]
Ew. możesz spróbować
  1. SELECT DISTINCT(srv_dsc)
  2. FROM `data` ORDER BY time DESC
matisq
Chciało mi się i ciagle próbuje ale dalej nie działa!

Takie zapytanie nie zwraca mi nic sensownego. Po co mi srv_dsc skoro nie wiem kiedy to miało miejsce?
  1. SELECT DISTINCT(srv_dsc)
  2. FROM `data` ORDER BY time DESC


A zapytanie
  1. SELECT * FROM service_data WHERE host_name='host'
  2. GROUP BY service_output
  3. ORDER BY timet DESC


zwraca mi to co chcę ale nie ostatnie wystąpienie tylko jakieś inne. Jak dodać warunek na otrzymanie ostatniego wpisu z bazy ?

Już działa. Rozbiłem to na kilka tabel i zrobiłem kombinację zapytania w MySQL i PHP.

Ale mam kolejny problem. Otóż wywołuję takie oto zapytanie.

  1. SELECT * FROM service_data WHERE host_id = "33" AND service_id = "1" ORDER BY id DESC LIMIT 1 ;

I czas odpowiedzi to ponad 20 sekund.
Baza ma 1,2 GB i ponad 500000 rekordów.
Indeksowana jest po 'id' który jest autoinkrementowany.

Czy istnieje jakiś sposób na zmniejszenie tego czasu? Takich zapytań chcę zrobić koło 300!

Nie muszę chyba dodawać że:
Handler_read_rnd=16 k
Handler_read_rnd_next=39 M

To już chyba norma.
Jakieś pomysły?
Kamil Jura
Pomyśl o cache w zapytaniach i nie pobieraj " * " - wszystkiego z tabeli.
matisq
Spróbowałem wywalić * ale to nic nie zmienia.
Tak sobie myśle że może jest inny problem. Mam tych rekordów 500000 w sumie ale po wywołaniu zapytania:
  1. SELECT * FROM service_data WHERE host_id = "33" AND service_id = "1" ORDER BY id DESC;

Zwraca mi 4000 linii. I dopiero z tych 4000 linii ma znaleść najnowszy wpis (najwyższe id).

Nie ma jakiegoś lepszego sposobu na to?
Co to znaczy cache zapytań? smile.gif
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.