2012-04-01 17 views
6

Mam pewne problemy z tworzeniem zapytania mySQL z PHP. Mamy jedną tabelę o nazwie data_instant, z wprowadzoną serią sumarycznych obserwacji, o nazwie Count_Qty, i chcemy wyodrębnić poprzednią, aby odliczyć od nowej obserwacji, aby obliczyć wzrost.MySQL za pomocą MAX() z klauzul WHERE

$result = mysql_query("SELECT *, 
MAX(Record_Time) 
FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type'; 

$row = mysql_fetch_array ($result); 

Zasadniczo spodziewam się, że zostanie zwrócony maksymalny wiersz Record_Time, ale zamiast tego jest to tylko pierwsza instancja, która została odebrana. Poprzednia obserwacja ma najwyższą wartość Record_Time (Unix datestamp), więc nie jest dla mnie jasne, dlaczego to nie zadziała ...

+0

Dziwne domysły, czy spodziewana obserwacja nie została wybrana przez ograniczenia WHERE? lub czy twój "Record_Time" nie jest faktycznie typem całkowitym? –

Odpowiedz

14

Jeśli chcesz uzyskać wiersz z najnowszej wartości Record_Time, tylko sortowanie wierszy w w kolejności malejącej: Record_Time i górny wiersz:

SELECT * 
FROM data_instant 
WHERE Node_ID='$nodeID' 
    AND Type='$type' 
ORDER BY Record_Time DESC 
LIMIT 1; 
+0

Dobra odpowiedź, to oczywiste po tym, jak to wyjaśniłeś, ale szukałem tego przez około godzinę. – usumoio

+0

To działa, ale czy istnieje sposób, aby to zrobić bez sortowania całego wyniku? Czy optymalizator zapytań znajdzie skuteczny sposób na znalezienie maksimum? – adamF

+0

@adamF: Cóż, nie jestem pewien, czy możesz ustalić, czy wartość jest większa niż jakakolwiek inna wartość w zestawie bez przechodzenia przez cały zestaw. Jeśli chodzi o twoje drugie pytanie, przepraszam, nie mam zbyt dużej wiedzy na temat optymalizatora zapytań (przynajmniej nie na temat MySQL). Ale wtedy nie martwiłbym się, czy optymalizator zapytań * może * wymyślić dobry plan wykonania dla mojego zapytania. Wyraź swoją prośbę tak prosto, jak to tylko możliwe i pozwól, aby optymalizator znalazł najlepszy sposób jej uruchomienia - w końcu to jest jej miejsce. * Jeśli/kiedy * występują problemy z wydajnością, * wtedy * zacznij myśleć o sposobach poprawy. –

0

Jeśli masz więcej niż MAX, powinieneś dodać GROUP BY do swojego oświadczenia, aby zapewnić prawidłowe agregacji:

SELECT columnA, 
    columnB, 
    MAX(Record_Time) 
FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type' 
GROUP BY columnA, columnB; 
0

bym oczekiwać, że rząd max Record_Time zostać zwrócone

Następnie należy po prostu poprosić o tej kolumny:

SELECT MAX(Record_Time) FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type' 

Spowoduje to wyświetlenie maks. Czasu record_time dla określonego id_węzła i typu.

1

Klauzula wybiera wszystkie wiersze pasujące do Node_ID = '$ nodeID' AND Type = '$ type'.

Dla każdego z tych wierszy zwróci on wszystkie pola i maksymalny czas rekordu.

Jeśli chcesz wiersz z maksymalnego czasu nagrywania trzeba dodać, że do where klauzuli:

SELECT * 
FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type' 
and Record_Time = (select MAX(Record_Time) 
     FROM data_instant 
     WHERE Node_ID='$nodeID' 
     AND Type='$type') 
Powiązane problemy