Select e min()

Ciao a tutti.

Ho un problema con una query.

Ho una tabella strutturata così:

| Nome | Data          | Gara   | Tipologia   | Km | Tempo Totale | T/Km |

  Mario   20/03/2008    Cuneo   1/2 Marat.    21     1.29.50           4.18     

Ovviamente ogni utente può inserire le proprie gare e ovviamente alla fine ogni utente avrà inserito + gare con tempi diversi.

Nella mia query io volevo fare un'estrazione in modo tale che mi prendesse 1 solo campo per ogni utente (T/Km) e che questo valore sia il migliore cioè il tempo al km + basso.

Ho già provato con la funzione min ma mi restituisce solo il campo T/Km e non i dati relativi al nome della gara ecc...

Ho provato con group ecc....

Non sò più come fare.....

inviato 8 anni fa
danilob
X 0 X

Ciao,

potresti usare la funzione order by e LIMIT BY in questo modo:

$sql = "select * from nometabella order by nomecampo asc LIMIT BY 1";

Ovviamente sostituisci nometabella e nomecampo con quelli di tuo interesse. "asc" indica che l'ordinamento è crescente, "desc" decrescente O0

La funzione limit ti estrae solo il numero di record che ti interessano, nel nostro caso solo 1.

 :bye:

Zeta

risposto 8 anni fa
zeta80
X 0 X

non 1 ma uno per ogni nome.

Grazi avrà un suo record tempo, Danilo un'altro e così via.

Dicendo limit 1 avrò si il minimo ma quello in assoluto..

risposto 8 anni fa
danilob
X 0 X

Potresti fare un ciclo for per tutti gli utenti partecipanti alla gara ed aggiungere una clausola where alla query che ho postato prima.

 :bye:

Zeta

risposto 8 anni fa
zeta80
X 0 X

Poi fare una GROUP BY sul nome dell'utente, così che per ogni utente venga mostrato un solo record, e poi metti una MIN(T/Km) per prendere il risultato migliore per ciascuno di essi.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

ho provato con questa query ma non mi restituisce nulla:

$query = @mysql_query ("SELECT tempo_km_gara, id_comp, data, nome_gara, tipologia_gara, km_gara, tempo_gara,  note, competizioni.id AS administrators,  nome, cognome, indirizzo_email FROM competizioni LEFT JOIN administrators ON competizioni.id = administrators.id group by cognome MIN(tempo_km_gara)");

risposto 8 anni fa
danilob
X 0 X

E ci credo...è sbagliata!

SELECT MIN(tempo_km_gara) FROM ... WHERE ... GRUP BY nome, cognome

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

ok ma così mi da 1 solo record quello con il tempo minore e basta

risposto 8 anni fa
danilob
X 0 X

ho fatto così ma non mi dà il min..

 $query = @mysql_query ("SELECT MIN(tempo_km_gara), tempo_km_gara, id_comp, data, nome_gara, tipologia_gara, km_gara, tempo_gara,  note, competizioni.id AS administrators,  nome, cognome, indirizzo_email FROM competizioni LEFT JOIN administrators ON competizioni.id = administrators.id group by cognome ");

risposto 8 anni fa
danilob
X 0 X

se invece la faccio così mi seleziona il tempo minore ma i dati degli altri cami (esempio nome gara, km, ecc) sono sbagliati..

 $query = @mysql_query ("SELECT MIN(tempo_km_gara)as tempo_km_gara, id_comp, data, nome_gara, tipologia_gara, km_gara, tempo_gara,  note, competizioni.id AS administrators,  nome, cognome, indirizzo_email FROM competizioni LEFT JOIN administrators ON competizioni.id = administrators.id group by cognome order by tempo_km_gara ");

risposto 8 anni fa
danilob
X 0 X

si, infatti nell'esempio che ti ho fatto non ho inserito gli altri campi proprio per questo motivo.

Se stai usando mysql 4.1 o successivi puoi usare una subselect, altrimenti sei costretto ad eseguire più di una query. Tutti i dettagli li trovi qui:

http://dev.mysql.com/doc/refman/4.1/en/example-maximum-column-group-row.html

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

fatico un po' con l'inglese :))

risposto 8 anni fa
danilob
X 0 X

Che versione di MySQL avrai sul server?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Versione MySQL: 5.0.54-log

risposto 8 anni fa
danilob
X 0 X

Perfetto, allora guarda le query proposte qui:

http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Cavolo che fatica...

Fatico nel collegare le tabelle.. Eppure ho 2 guide sulle relazioni...

Mi potresti indicare un SITO  in italiano dove vengano descritte bele le relazioni e l'utilizzo di JOIN?

risposto 8 anni fa
danilob
X 0 X

non riesco... mi puoi dare una mano con un po' di codice?

risposto 8 anni fa
danilob
X 0 X

In linea di principio la query deve essere qualcosa di simile:

SELECT * FROM nome_tabella t1 JOIN (

SELECT cognome, MIN(tempo_km_gara) tempo_km_gara FROM nome_tabella GRUP BY cognome) t2

ON t1.cognome = t2.cognome AND t1.tempo_km_gara = t2.tempo_km_gara
risposto 8 anni fa
Gianni Tomasicchio
X 0 X

ma cosa intendi x "t1"?

ho provato così ma non funziona:

$query = @mysql_query ("SELECT * FROM competizioni t1 JOIN (SELECT cognome, MIN(tempo_km_gara) tempo_km_gara FROM administrators GRUP BY cognome) t2 ON t1.cognome = t2.cognome AND t1.tempo_km_gara = t2.tempo_km_gara");

risposto 8 anni fa
danilob
X 0 X

Inizia col togliere la @ da mysql_query altrimenti non saprai mai il perché dei malfunzionamenti. Fatto ciò dimmi che errore ricevi.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

non mi dà nessun errore semplicemente nessun record

risposto 8 anni fa
danilob
X 0 X

Ho riletto l'ultima query che hai riportato e c'è un errore: devi usare "FROM competizioni" sia nella SELECT esterna che in quella interna.

La tabella administrator per il momento non considerarla

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

ok mi il cognome dove lo prendo allora?

è nella tabella admin così come il nome, ecc..

risposto 8 anni fa
danilob
X 0 X

Tieni presente che queste sono solo delle prove...

Se non ho capito male la colonna "id" identifica un utente nella tabella competizioni. Se è così allora prova questa query:

SELECT * FROM competizioni t1 JOIN (

SELECT id, MIN(tempo_km_gara) tempo_km_gara FROM competizioni GRUP BY id) t2

ON t1.id= t2.id AND t1.tempo_km_gara = t2.tempo_km_gara

JOIN administrators t3 ON t1.id = t3.id

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda