|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |||
Senior Member
Iscritto dal: Nov 2002
Messaggi: 11745
|
[SQL] Query con GROUP BY + ORDER BY :D
Ciao ragazzi, ho un piccolo problemino con una query, vediamo se potete aiutarmi...
ho 2 tabelle organizzate cosi' id | nome | desc id | last_up_time | valore1 | valore2 vorrei fare una query dove ottengo id, nome, desc... fino e qui avrei un banale Quote:
Quote:
cioe' in table 2 ci saranno molti valori con lo stesso id, in quanto la chiave primaria e' il tempo di aggiornamento che e' sempre diverso... a me interessa ottenere un unica riga di table2 dove il tempo sia il + aggiornato =) non mi interessano tutte le altre righe con tempo vecchio ho provato ad usare group by table1.id ma non funziona =|, cioe' mi vengono restituiti tutti i dati come li vorrei solo che l'ordinamento e' fatto in seguito... non prima di gruppare =|, le righe hanno il campo time che vogliono loro non l'ultimo aggiornamento =( Quote:
__________________
Ho fatto affari con: troppi per elencarli Vendo: NAS PRO QNAP 4 BAIE 419P+ CON LCD |
|||
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
In SQL standard si puo' fare, ma solo con una autojoin
Il problema e' anche solo limitabile alla tabella2, ovvero: Vorrei ottenere un risultato tipo: id | last_up_time | valore1 | valore2 ma con solo i valori piu' aggiornati, per ciascun id. Quanto segue suppone che la chiave primaria della tabella2 sia esattamente (id, last_up_time ) Per poterlo fare in SQL-92 standard occorrono 2 passi: per ciascun ID cerco qual e' il last_up_time maggiore, scrivendo la subquery relativa Metto in join la subquery ottenuta con la tabella orignale, filtrando i record interessati. Si chiama autojoin perche' la tabella in questione e' referenziata due volte. Per questo esempio la subquery sarebbe SELECT id,max(last_up_time) max_last_up_time FROM tabella 2 GROUP BY id mentre la query completa sarebbe Codice:
SELECT tabella2.* FROM tabella2 JOIN (SELECT id,max(last_up_time) max_last_up_time FROM tabella 2 GROUP BY id) AS subq ON (tabella2.ID=subq.ID AND tabella2.last_up_time=subq.max_last_up_time) Per risolvere tale limite dell'SQL, per un problema tutt'altro che raro, le singole implementazioni hanno dotato il loro motore di soluzioni diverse. Oracle: Funzioni analitiche, inserite dal 8.1.6.2 SQL-Server 2000: Mix di TOP e ORDER BY. Non risolve completamente l'auto-Join SQL-Server 2005: Funzioni analitiche (limitate). My-Sql: So che esiste anche qui il TOP (mi sembra si chiami LIMIT). Non so se si puo' usare all'interno di subquery e insieme a ORDER BY. Se si potesse sarebbe la stessa soluzione di SQLServer 2000 In sostanza: Prova con la soluzione standard. Se poi non ti piace studia la LIMIT con ORDER BY. C'e' ancora una soluzione possibile, relativamente ad una estensione del SQL standard che si chiama "INLINE Query", che pero' e' praticabile solamente se il numero di colonne come le tue valore1, valore2,... valoren e' esattamente uguale ad 1, altrimenti fa pena. Nel tuo caso e' gia' 2, pertanto non va bene. Non so neppure se funziona sotto mysql Codice:
SELECT ttt.id, max( ttt.last_up_time ) max_last_up_time, (SELECT valore1 FROM tabella2 tint WHERE tint.id=ttt.id AND tint.last_up_time=max_last_up_time) valore1 FROM tabella2 ttt GROUP BY id Ma anche in questo caso come vedi si referenzia 2 volte la tabella originale.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 16-02-2008 alle 12:14. Motivo: Inline Query, non Inline Function |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 11745
|
Grazie sei stato chiarissimo =) ci sono riuscito con la prima soluzione
![]()
__________________
Ho fatto affari con: troppi per elencarli Vendo: NAS PRO QNAP 4 BAIE 419P+ CON LCD |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2005
Città: Toscana
Messaggi: 1196
|
altrimenti non puoi usare il costrutto DISTINCT per evitare le ripetizioni
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Non direi, la tabella2 ha righe tutte diverse, non ci sono ripetizioni.
Puoi provare a spiegarti meglio?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2005
Città: Toscana
Messaggi: 1196
|
SELECT DISTINCT attributo
FROM tabella/e la distinct si fa sull'attributo della select che ti frega se hai più tabelle... non avevi detto che non volevi eliminare i risultati doppi ? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Mi sa che non hai letto bene il problema.
Lui ha una tabella id | last_up_time | valore1 | valore2 Dove ID e' ripetuto tante volte, per degli istanti diversi. Vuole avere una query che restituisca, per ciascun ID, quale e' il record con la data piu' grande, e quali sono i due relativi campi valore1 e valore2
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:12.