2011-10-20 20 views
13

Jest to struktura tabeliJak wybrać MAX (data)?

CREATE TABLE `reports` (
    `report_id` int(11) NOT NULL auto_increment, 
    `computer_id` int(11) NOT NULL default '0', 
    `date_entered` datetime NOT NULL default '1970-01-01 00:00:00', 
    `total_seconds` int(11) NOT NULL default '0', 
    `iphone_id` int(11) default '0', 
    PRIMARY KEY (`report_id`), 
    KEY `computer_id` (`computer_id`), 
    KEY `iphone_id` (`iphone_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=120990 DEFAULT CHARSET=latin1 

muszę SELECT oświadczenie, że będzie notowanie report_id za computer_id z ostatnio wprowadzonych date_entered, i nie mam pojęcia jak to zrobić. Czy ktoś może wskazać mi właściwy kierunek? Z góry.

Odpowiedz

28

ten powinien zrobić:

SELECT report_id, computer_id, date_entered 
FROM reports AS a 
WHERE date_entered = (
    SELECT MAX(date_entered) 
    FROM reports AS b 
    WHERE a.report_id = b.report_id 
     AND a.computer_id = b.computer_id 
) 
+2

Prawie. Pominąłem "a.report_id = b.report_id" i to wystarczyło. Dziękujemy – poetter747

+2

Jest to trochę mało wydajne, ponieważ generujesz zbyt wiele podkwerend. Zamiast tego spróbuj użyć nieskorelowanego podzapytania. https://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html – Pablo

+0

Pablo jest poprawny. Filtrowanie można wykonać wcześniej, łącząc podzapytanie, a tym samym oszczędzając wydajność. – twicejr

11

Czy chcesz wyświetlać tylko ostatni date_entered lub zamówić, zaczynając od daty ostatniej_daty?

SELECT report_id, computer_id, date_entered 
FROM reports 
GROUP BY computer_id 
ORDER BY date_entered DESC 
-- LIMIT 1 -- uncomment to only show the last date. 
+2

Kiedy id to zrobić, pojawia się źle report_id. Sprawdziłem instrukcję WHERE computer_id = 30. Wynik był pierwszym id_raportu wszystkich znalezionych report_ids w połączeniu z najnowszym date_entered – poetter747

3

Accordig do tego: https://bugs.mysql.com/bug.php?id=54784 odlew jako char powinno załatwić sprawę:

SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR)) 
FROM reports 
GROUP BY report_id, computer_id 
+0

To da ci maksymalną datę, ale niekoniecznie inne wartości z tego samego wiersza. – Vincent

0
SELECT report_id, computer_id, date_entered 
FROM reports 
WHERE date_entered = (
    SELECT date_entered 
    FROM reports 
    ORDER date_entered 
    DESC LIMIT 1 
) 
+1

Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawi (// meta.stackexchange.com/q/114762) jego długoterminową wartość, pokazując * dlaczego * jest to dobre rozwiązanie problemu i sprawiłoby, że byłby bardziej przydatny dla przyszłych czytelników z inne, podobne pytania. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienia, w tym założenia, które podjąłeś. –