Newsgroup: it.comp.software.database
Titolo: [MySql] Ultimo record

Eseguo una query con il criterio di aggregazione GROUP BY.
Ho necessità di estrarre l'ultimo valore inserito di una singola colonna
(non ID) per ogni singolo raggruppamento.
JetSQL di microsoft mette a disposizione le funzioni FIRST() e LAST() che,
analogamente a MAX() o MIN(), assolvolo egregiamente al compito.
Purtroppo non sono riuscito a trovare un "trucco" per ottenere lo stesso
risultato con MySql.
Grazie a tutti.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


FIRST e LAST sono "trucchi" dei database da desktop.
Un database ralazionale non ha il concetto di first e last, proprio per 
via della definizione, che vuole la struttura concettuale dei dati 
separata dall'implementazione fisica.
Cio' detto, per avere il primo o l'ultimo record inserito, devi usare 
una clausola WHERE per identificarli.
E' buona pratica mettere un campo TIMESTAMP nei record per i quali hai 
questa necessita', cosi' puoi fare una ricerca tipo
SELECT campo1, MAX(colonnaTimeSTamp) FROM nometabella GROUP BY campo1;
ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

 (non ID) per ogni singolo raggruppamento.
Forse non ho capito granchè, ma ordinare per il dato che ti serve e con
limit prendere l'ultimo? (o il primo, a seconda dell'ordinamento)
Del tipo:
... order by MIO_DATO desc limit 1;
Ripeto ... forse non ho capito! :-)
Ciao!
--ev


Usando ORDER BY MIO_DATO DESC LIMIT 1
si ottiene l'ultimo campo con il valore di MIO_DATO, che non e' 
necessariamente l'ultimo campo inserito.
Esempio, dopo questi inserimenti:
CREATE TABLE TABELLA ( a INT, b char(1));
INSERT INTO TABELLA (a,b) VALUES (2,'b');
INSERT INTO TABELLA (a,b) VALUES (1,'a');
INSERT INTO TABELLA (a,b) VALUES (4,'d');
INSERT INTO TABELLA (a,b) VALUES (5,'e');
INSERT INTO TABELLA (a,b) VALUES (3,'c');
Se fai
SELECT * FROM TABELLA ORDER BY a DESC LIMIT 1
ti da' ( 5, 'e'), che e' il record con il valore piu' alto, ma non e'
l'ultimo inserito.
Similmente, usando "ORDER BY a LIMIT 1" si ottiene (1, 'a'), che e' il 
piu' basso, ma non il primo inserito.
Per avere l'ultimo bisogna usare un timestamp, oppure organizzarsi 
meglio :-)


 Grazie a tutti.
Non è molto elegante (!) ma per simulare il LAST puoi usare
SUBSTRING( MAX( CONCAT(campo_data,campo) ), 20) AS ultimo
dove 'campo_data' è un campo di tipo datetime
ciao

Ok,
cercherò di applicare sia la soluzione di gmax ceh wild.
Il fatto è che la query, per me, è un pò più complicata del normale avendo
utilizzato un "self join", dovendo "legare informazioni appartenenti alla
stessa tabella.
Credo che non sia sufficiente, cmq Vi posto la query che utilizzo.
SELECT 
mes_tbl.id
,
 mes_tbl.subject,
 
mes_tbl.name
,
 mes_tbl.mes_date,
 count(
mes_tbl_1.id
) AS replies,
 max(
mes_tbl_1.id
) As last_post_id,
 mes_tbl.visit,
 max(mes_tbl_1.mes_date) AS last_post_date
FROM mes_tbl
 LEFT JOIN mes_tbl AS mes_tbl_1
 ON 
mes_tbl.id
 = mes_tbl_1.thread_id
WHERE mes_tbl.forum_id = 12 and mes_tbl.thread_id=0
GROUP BY 
mes_tbl.id
ORDER BY 
mes_tbl.id
 DESC
Vi farò sapere l'esito delle modifiche.
Grazie ancora.


 meglio :-)
Vero, avevo sperato che avesse un campo incrementale tramite il quale
ordinare i dati e così risalire facilmente all'ultimo inserito, ma non
pare essere così!
Ciao
--ev

Ho applicato le modifiche alla query secondo i vostri consigli, ma il valore
estratto e' sempre il primo del "gruppo".
Ho provato anche a modificare i criteri di ordinamento aggiungendo il campo
interessato, ma il risultato non cambia :-(
