2015-09-24 9 views
5

Cercando di ottenere l'ultimo record univoco dalla seguente tabella. Ci sono alcuni doppi, quelli dovrebbero essere filtrati.SELEZIONA l'ultima voce nella colonna come unica dall'altra colonna

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 

L'utilizzo di questa query (trovata qui) è il mio miglior impegno ma restituisce solo un risultato.

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

vorrebbe ottenere questo listato come ultima entrata e unica sul 'azione' per il 'soggetto':

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 

La speranza qualcuno ha una soluzione! Grazie!

+0

Sì. I timestamp sono sempre unici. – KJS

+0

poiché gli ID sono incrementali, l'ultimo record avrà l'ID massimo. corretta? – Andreas

risposta

4

È possibile farlo con una sottoquery. Questo è lo sqlfiddle piena: 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

Ottima soluzione! Grazie mille! – KJS

1

È necessario utilizzare una sottoquery:

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

La sottoquery trova l'azione più grande per ogni argomento. Questi dati vengono quindi utilizzati per unirsi alla stessa tabella, che viene utilizzata per recuperare gli altri campi in tale record "max'd".

1

Siamo spiacenti, se non hai corretto, leggi la tua domanda. Ecco una query di lavoro:

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; 

Risultato:

+----+-------+--------+---------------------+ 
| 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) 
Problemi correlati