2015-09-24 19 views
5

Próbujesz uzyskać ostatni i niepowtarzalny rekord z poniższej tabeli. Jest w niej trochę dubletów, które powinny zostać odfiltrowane.WYBIERZ ostatni wpis w kolumnie jako unikalny z innej kolumny

id topic action date 
1 10127 2 2015-09-24 15:28:30 
2 10127 4 2015-09-24 15:29:26 
3 10127 2 2015-09-24 15:30:01 
4 10127 3 2015-09-24 15:30:55 
5 10127 1 2015-09-24 16:07:25 
6 10127 5 2015-09-24 16:10:25 
7 10127 4 2015-09-24 16:29:26 

Korzystanie z tego zapytania (tutaj) jest moim najlepszym wysiłkiem, ale zwraca tylko jeden wynik.

SELECT MAX(action) as action,topic,date FROM ...... 
GROUP by topic 
ORDER by action DESC 

chciałby uzyskać tę ofertę jako najnowszego wpisu i unikalne na „działania” dla „tematu”:

id topic action date 
3 10127 1 2015-09-24 15:30:01 
4 10127 2 2015-09-24 15:30:55 
5 10127 3 2015-09-24 16:07:25 
6 10127 4 2015-09-24 16:10:25 
7 10127 5 2015-09-24 16:29:26 

nadzieję, że ktoś ma rozwiązanie! Dzięki!

+0

Tak. Znaczniki czasu są zawsze unikalne. – KJS

+0

ponieważ twoje ID są przyrostowe, ostatni rekord będzie miał maksymalny ID. poprawny? – Andreas

Odpowiedz

4

Możesz to zrobić z podzapytaniem. Jest to pełna sqlfiddle: http://sqlfiddle.com/#!9/f7afa/23

Select * FROM (

SELECT 
    DISTINCT `topic`, `action`, `date` 
FROM 
    ForgeRock  
ORDER by date DESC, action ASC 

) as X 
    GROUP BY action 
+0

Świetne rozwiązanie! Dziękuję Ci bardzo! – KJS

1

Trzeba użyć podzapytania:

SELECT * 
FROM yourtable 
JOIN (
    SELECT topic, MAX(action) 
    FROM yourtable 
    GROUP BY topic 
) AS child ON (yourtable.topic = topic) AND (yourtable.action = child.action) 

Podzapytanie znajdzie największą akcję dla każdego tematu. Dane te są następnie używane do łączenia się z tą samą tabelą, której używasz do pobierania innych pól w tym rekordzie "maks.".

1

Przepraszamy, jeśli nie poprawiłeś, przeczytaj swoje pytanie. Tutaj zapytanie pracy:

SELECT id,topic,@action:[email protected]+1 AS ACTION,DATE 
FROM 
    (SELECT t1.id, 
      t1.topic, 
      t1.date , 
      t2.id AS dup 
    FROM tab t1 
    LEFT JOIN tab t2 ON t1.action = t2.action 
    AND t2.id > t1.id) AS t, 

    (SELECT @action:=0) AS tmp 
WHERE dup IS NULL; 

Wynik:

+----+-------+--------+---------------------+ 
| id | topic | ACTION | date    | 
+----+-------+--------+---------------------+ 
| 3 | 10127 |  1 | 2015-09-24 15:30:01 | 
| 4 | 10127 |  2 | 2015-09-24 15:30:55 | 
| 5 | 10127 |  3 | 2015-09-24 16:07:25 | 
| 6 | 10127 |  4 | 2015-09-24 16:10:25 | 
| 7 | 10127 |  5 | 2015-09-24 16:29:26 | 
+----+-------+--------+---------------------+ 
5 rows in set (0.00 sec) 
Powiązane problemy