2011-01-28 11 views
13

Mam tabelę, która zawiera (powiedzmy) wszystkie czasy, gdy użytkownik spojrzał na określonej stronie internetowej. Użytkownicy mogą oczywiście spojrzeć na stronie więcej niż jeden raz, więc nie może być wielokrotne wpisy dotyczące użytkowników i stron, tak jak poniżej:Jak wybierać wiersze z MySQL na podstawie maksymalnej wartości kolumny + grupowania

nid  time user page_id 
25  8000  4  467 
24  7000  1  482 
23  6000  1  484 
22  5000  1  482 
21  4000  5  467 
20  3000  4  467 

chcę zrobić kwerendę, która zwraca wiersze odpowiadające każdej stronie widzianej przez każdego użytkownik Z ZAŁOGIEM, że jeśli użytkownik obejrzał stronę więcej niż raz, otrzymuję wiersz odpowiadający najnowszemu widokowi (tj. największej wartości CZASU). Tak więc, należy uzyskać to:

nid  time user page_id 
25  8000  4  467 
24  7000  1  482 
23  6000  1  484 
21  4000  5  467 

Tracimy wiersz 22 ze względu użytkownika 1 spojrzał na stronie 482 w późniejszym czasie, a tracimy wiersz 20, ponieważ użytkownik 4 spojrzał na stronie 467 w późniejszym czasie.

Prawie to odkryłem, ale nie mogę tego całkiem złamać, a jednocześnie przekonać samego siebie, że wyniki, które otrzymuję, będą generalnie poprawne, a nie tylko przypadek moich przypadków testowych. Wciąż przechodzę pomiędzy zapytaniami GROUP BY lub DISTINCT i osadzonymi zapytaniami, a potem mój mózg eksploduje. Jakieś sugestie? Dzięki!

+0

Duplikat pytanie [http: // stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-another-column-in-sql] – user1486030

Odpowiedz

19

Jeśli potrzebujesz pełnego wiersza można użyć tego:

SELECT fullTable.nid as nid, 
     recent.time as time, 
     fullTable.user as user, 
     fullTable.page_id as page_id 
    FROM TableName fullTable 
     INNER JOIN (SELECT MAX(t1.time) as time, t1.user, t1.page_id 
         FROM TableName t1 
        GROUP BY user, page_id) recent 
       ON recent.time = fullTable.time AND 
        recent.user = fullTable.user AND 
        recent.page_id = fullTable.page_id 
ORDER BY time DESC 

Jeśli poprosisz o kolumnie z zewnątrz "grupy przez" klauzuli, MySQL może zwrócić dowolną wartość dla tej kolumny wewnątrz tej grupy. Jeśli więc wszystkie wartości w grupie nie są takie same, tak jest w twoim przypadku, nie możesz włączyć go bezpośrednio do klauzuli select, musisz użyć join.

można przeczytać więcej na temat nie zgrupowane kolumn na MySQL Działa na the reference

Jeśli nie potrzebujemy pola NID, można to wykorzystać inne:

SELECT MAX(time) as time, user, page_id 
    FROM TableName 
GROUP BY user, page_id 
ORDER BY time DESC 
+0

Tak, to jest właściwa sprawa. Dziękuję bardzo! Prawdopodobnie powinienem był wspomnieć, że potrzebuję pola NID; Dotarłem do twojego drugiego przykładu, który nie był pozbawiony NID, ale to, jak zauważono, nie wystarczy. Zaznaczanie odpowiedzi i potwierdzanie jej jako odpowiedź nastąpi; Daję sobie pięć punktów za prawidłowe uznanie, że nigdy bym tego nie zrobił sam ... –

1

Spróbuj tego:

SELECT * 
    FROM <YOUR_TABLE> 
WHERE (user, page_id, time) IN 
    (
    SELECT user, page_id, MAX(time) time 
     FROM <YOUR_TABLE> 
    GROUP BY user, page_id 
    ) 
0
SELECT nid, MAX(time), user, page_id 
FROM TableName 
GROUP BY nid, user, page_id 
Powiązane problemy