No no, ho capito l'inghippo,
o meglio mi sono fatto un'idea abbastanza precisa (poi se qualcuno ha la chiave meglio ancora),
facciamo tutti lo stesso errore, o meglio l'"ingenuità" di pensare che, se nella SELECT oltre al MAX() aggiungo * o i campi che mi interessano, il record che risulta avrà tutti i campi direttamente associati al campo (o espressione) su cui ho fatto MAX(). Ebbene no.
Dunque la soluzione (o meglio il "rimedio") l'ho trovata qui, manuale ufficiale:
http://dev.mysql.com/doc/mysql/en/ex...group-row.html
ancor più utili i commenti degli utenti in basso, che addirittura correggono qualche erroruzzo.
In breve, per chi non sguazza nell'inglese (o per i più pigri :grin:):
fondamentalmente è uno degli esempi sulle query più comuni ma sulle quali si può avere difficoltà (e infatti!) e pone un'esigenza:
"Per ciascun articolo trovare il o i venditore col prezzo più elevato"
Si basa su una tabella sola comunque chiarisce ugualmente sulle possibilità:
1) Il metodo più ottimizzato è usare una SUB-SELECT, una select dentro la select. Peccato che si può fare solo dalla versione MySQL 4.1 in poi, mentre qui su AV abbiamo la 3.23 o qualcosa di simile, comunque non se po' fa!
2) Come metodo alternativo propone uno scriptone sql allucinogeno, di almeno una decina di righe con creazione di tabella temporanea... oOOOOH? ma scherziamo?
3) Come metodo "di scorta", per chi deve usare una query sola come noi, c'è una "pecionata terrificante", anche loro si vergognano di proporla... ma per assurdo è l'unica mia salvezza, l'ho adottata e funziona! (e te credo)
Una porcata assurda, che ha fa rabbrividire quasi tutti quelli che commentano (proponendo altre soluzioni che non mi aiutano perché usano una SELF-JOIN, la join sulla tabella stessa).. però funziona una favola.
Dunque viene notoriamente definito "MAX-CONCAT TRICK" (=trucchetto del max-concat) insomma la classica pezza. Consiste nel crearsi (col concat) un unico stringone tutto dentro al MAX(), con tutti i campi che ci interessano, sistemati e formattati ovviamente con riempimento di spazi (LPAD) ciascuno occupando un tot di caratteri. Capito come? guardate bene la query della terza soluzione, altrimenti non si capisce nulla a parole...
Nel nostro esempio invece sarà più o meno così (concatenando simbolicamente solo un altro paio di campi altrimenti è un marasma):
Codice:
SELECT count(ms.pid) as nmessaggi,
max( concat( concat(ms.time, lpad(ms.testo,100,' ')), lpad(ms.bid,10,' ')) ) as ccdata
FROM board bd, bl_msg ms WHERE bd.id = ms.bid
GROUP BY bd.id ORDER BY ms.time DESC LIMIT 10
Dunque ho ridotto i nomi da timestamp a time, da boardid a bid, in più visto che ci sono mi faccio ritornare il numero di messaggi totale (count()) per ogni board.
Come vedrete siamo eventualmente costretti a "troncare" dei campi con lunghezza maggiore (per es. prendo solo i primi 100 caratteri del messaggio, o se si vuole si può anche esagerare).
Diciamo che la "pezza" tutto sommato non mi viene affatto scomoda, però è una vergogna ricorrere a questi mezzucci ancora nella versione 3, e che ca...
Poi se AV migra alla 4.x meglio ancora!! :grin: