Estrarre valori MAX da un db con una left join

maxus68

Utente Attivo
1 Nov 2016
23
0
1
52
Ciao a tutti e buone feste!
Ho bisogno di estrarre da un DB un elenco di atleti e il relativo valore MAX per ogni gara a cui partecipano, esempio:

IDGARA 1
Atleta 1 max 5
Atleta 2 max 4

IDGARA 2
Atleta 1 max 17
Atleta 2 max 18

Con la query che ho costruito riesco ad estrarre gli atleti nelle rispettive gara ma il valore MAX non si riferisce alla singola gara ma solo al singolo atleta. In sostanza se l'atleta 1 in tutte le gare cui partecipa ha fatto registrare un valore MAX di 30 questo verrà preso anche nelle altre gare.
Seguendo l'esempio fatto sopra la query mi riporta:

IDGARA 1
Atleta 1 max 17 (invece di 5)
Atleta 2 max 18 (invece di 4)

IDGARA 2
Atleta 1 max 17
Atleta 2 max 18

La query che ho scritto è la seguente:
SQL:
SELECT tabella_sport_atleti.id_nominativo, tabella_sport_atleti.id_gara, MAX(risultati.valore) AS best, tabella_atleti.nominativo, tabella_atleti.classe
FROM tabella_sport_atleti
LEFT JOIN tabella_atleti ON tabella_atleti.id_nominativo = tabella_sport_atleti.id_nominativo
LEFT JOIN risultati ON risultati.id_nominativo = tabella_sport_atleti.id_nominativo
GROUP BY tabella_sport_atleti.id_gara, tabella_sport_atleti.id_nominativo

Ora il problema l'ho capito e cioè nel raggruppare per gara e nominativo la funzione MAX ma non riesco ad applicarla.
Qualcuno mi può dare una mano per favore?

Grazie e Buon Natale a tutti

Massimo
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.397
338
83
Grazie Massimo
grazie.gif


Un lieto Natale anche a te e tuoi cari
buon natale.gif
buon natale.gif
babbonatale.gif
babbonatale.gif
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
ho letto la query senza capirci molto,
ho creato un esempio (per me più comprensibile) che spero ti sia utile per il tuo progetto,
questa la query,
SQL:
select
  p.id_atleta
, p.id_gara
, max(p.punti) as best
, a.cognome
, g.gara
from punti p
left join atleti a on p.id_atleta = a.id
left join gare g on p.id_gara = g.id
group by p.id_atleta, p.id_gara, a.cognome, g.gara
order by p.id_gara, p.id_atleta

questo il risultato
1577119568153.png
 

maxus68

Utente Attivo
1 Nov 2016
23
0
1
52
Ciao Marino,
intanto grazie perchè è quello di cui ho bisogno, tuttavia mi sono dimenticato di segnalare che l'elenco deve riportare anche coloro che non hanno avuto un punteggio.
E qui ho sbagliato io a non specificarlo nell'esempio.
In poche parole bianchi luigi deve comparire nell'elenco è ovviamente il campo deve essere nullo/0 se non ha punteggio.
Nel tuo esempio manca una tabella che io ho chiamato:
Tabella_Sport_Atleti che riporta i seguenti campi
- id_sport_atleti
- id_gara
- id_nominativo

E' da questa tabella che devo tirare fuori l'elenco, infatti qui dentro compaiono tutti coloro che partecipano ad una o più gare.

Sto facendo alcune prove seguendo la tua query ma il risultato è che mi riporta sempre il punteggio max senza distinguere la gara per partecipante.

Spero tu abbia capito il senso di quello che ho scritto :)

Grazie

Massimo
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
ho modificato la query aggiungendo in fondo
SQL:
group by p.id_atleta, p.id_gara, a.cognome, g.gara
union
select
  9999999 as id_gara
, a.id
, 0 as best
, a.cognome
, 'OSSERVATORE' as gara
from @atleti a
left join @punti p
on a.id = p.id_gara
where p.id_gara is null
order by p.id_gara, p.id_atleta
con questo risultato

1577173849456.png


se serve altro, é meglio che pubblichi le tue tabelle con un esempio, perché non ho ancora capito come sono strutturate e come sono legate (indicizzate) tra loro
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
ripubblico le 3 query perché le ho sistemate, con l'ultima e l'ultimo risultato, se fosse il tuo obiettivo
SQL:
-- solo risultati presenti

select
  p.id_atleta
, p.id_gara
, max(p.punti) as best
, a.cognome
, g.gara
from @punti p
left join @atleti a on p.id_atleta = a.id
left join @gare g on p.id_gara = g.id
group by p.id_atleta, p.id_gara, a.cognome, g.gara
order by id_gara, id_atleta

-- risultati presenti più non partecipanti elencati in fondo alla lista

select
  p.id_gara
, p.id_atleta
, max(p.punti) as best
, a.cognome
, g.gara
from @punti p
left join @atleti a on p.id_atleta = a.id
left join @gare g on p.id_gara = g.id
group by p.id_atleta, p.id_gara, a.cognome, g.gara
union
select
  9999999 as id_gara
, a.id as id_atleta
, 0 as best
, a.cognome
, 'OSSERVATORE' as gara
from @atleti a
left join @punti p on a.id = p.id_atleta
where p.id_gara is null
order by id_gara, id_atleta

-- risultati presenti più non partecipanti elencati per gara

select
  p.id_gara
, p.id_atleta
, max(p.punti) as best
, a.cognome
, g.gara
from @punti p
left join @atleti a on p.id_atleta = a.id
left join @gare g on p.id_gara = g.id
group by p.id_atleta, p.id_gara, a.cognome, g.gara
union
select
  x.id_gara
, x.id_atleta
, x.best
, x.cognome
, x.gara
from (
select
  g.id as id_gara
, a.id as id_atleta
, 0 as best
, a.cognome
, g.gara
from @atleti a, @gare g ) x
left join @punti p on x.id_atleta = p.id_atleta AND x.id_gara = p.id_gara
where p.id_gara is null
order by id_gara, id_atleta

1577176445649.png
 

maxus68

Utente Attivo
1 Nov 2016
23
0
1
52
Ciao Marino,
non ho ancora avuto modo di provare il tuo codice sicuramente funzionante ;)
Però volevo ringraziarti anticipatamente e farti gli auguri di Buon Natale

Comunque ti faccio sapere appena riesco...

Grazie mille

Massimo
 

maxus68

Utente Attivo
1 Nov 2016
23
0
1
52
Ciao Marino,
sono riuscito a prendere in mano il tuo codice e sto cercando di applicarlo al mio caso.
Però non capisco due cose:
- dopo il FROM e LEFT JOIN inserisci la chiocciola prima del nome della tabella, perchè? Non conoscendo il significato ho provato metterlo anche io ma mi da errore;
- nella UNION SELECT prendi i dati da una tabella x, ma non capisco quale possa essere nel mio caso.

In ogni caso ti scrivo le tabelle e le loro relazioni che sono interessate:

Risultatitabella_sport_atletitbl_gare
ID_RisultatoID_Sport_atletiID_Gara
ID_GaraID_GaraID_Categoria
ID_NominativoID_NominativoID_Sport
Punteggio

In sostanza nella tabella "Risultati" riporto tutti i punteggi per gara e nominativo, nella "tabella_sport_atleti" inserisco per ogni nominativo la gara a cui partecipa (i nominativi di questa tabella devono comparire tutti anche senza risultato nella query), mentre nella tabella "tbl_gare" inserisco la categoria e lo sport (es. Allievi maschili, Salto in alto)

Probabilmente, e correggimi se sbaglio, nella tabella risultati al posto di ID_Gara e ID_Nominativo andrebbe messo ID_Sport_atleti, altrimenti non riesco a metterla in relazione correttamente.

Se così fosse, non è un problema cambiare sono in fase di sviluppo e sto mettendo valori non reali, come la dovrei strutturare la query?

Grazie e se non ci sentiamo buon anno!!
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
per provare le query, utilizzo delle tabelle temporanee, identificate dal nome preceduto dalla chiocciola,
per le tabelle effettive non va usata la chiocciola ( che credo sia una specificità del db che uso )

la x é il nome della tabella che viene generata come risultato della select from … @atleti a, @gare g ) x
é obbligatorio dare un nome alla tabella risultante, ho usato "x"

non capisco però gli indici che legano le tabelle e come possa essere definito il risultato ei una gara con la struttura che hai postato,

credo comunque che una corrispondenza possa essere,
Codice:
@punti     Risultati
id         ID_Risultato
id_gara    ID_Gara
id_atleta  ID_Nominativo
punti      Punteggio

@atleti    tabella_sport_atleti
?          ID_Sport_atleti
?          ID_Gara
id         ID_Nominativo
cognome    ?

@gare      tbl_gare
id         ID_Gara
?          ID_Categoria
?          ID_Sport
gara       ?

Buon anno anche a te !
 
Discussioni simili
Autore Titolo Forum Risposte Data
L estrarre valori max tra più tabelle MySQL 2
R Estrarre valori duplicati più volte PHP 0
C [PHP] Estrarre da una classe i valori che mi interessano PHP 5
S [Javascript] come estrarre valori array e inserirli in diverse variabili Javascript 1
G ESTRARRE VALORI MASSIMI E MINIMI IN UN INTERVALLO DI RECORD Database 7
asevenx [PHP] Estrarre valori evitando dublicati dal database PHP 2
F estrarre 5 valori per volta con mysql_fetch_array con annesso bottone PHP 12
R Estrarre i valori indipendentemente dagli spazi PHP 2
cosov Estrarre valori unici per classifica Classic ASP 4
M Estrarre valore con SELECT COUNT PHP 0
D Estrarre database con link esterno Database 10
S Raggruppare ed estrarre data più recente MySQL 3
F Estrarre ultima foto da cartelle PHP 2
C Estrarre dati stringa Sql Database 1
L Estrarre da Cartella una determinata 'via' PHP 15
J estrarre url dei file video da youtube "get_video_info" PHP 6
M Estrarre dati da una select HTML PHP 3
S [PHP] Estrarre dati da tabella e fare la media ad intervalli di tempo PHP 10
R [PHP] Estrarre id utente loggato.? PHP 4
S [PHP] Estrarre elementi array su più variabili PHP 5
S [PHP] Estrarre dati tabella in diversi array PHP 2
P [MS ACCESS] Estrarre più somme da una query MS Access 4
trattorino estrarre titolo video facebook in php PHP 0
D [WordPress] come fare per estrarre dati da un db MySQL tramite una form e visualizzare il risultato WordPress 0
N [PHP] Estrarre singolo valore da array PHP 4
trattorino [PHP] sql estrarre in base all'ultima visita PHP 4
P [Visual Basic] access sql estrarre id vendite x cli e articolo con data maggiore del recordset Visual Basic 2
Jensen [PHP] Estrarre prossimi 4 lunedì PHP 4
trattorino [PHP] estrarre dati singoli PHP 1
G [PHP] estrarre data da timeline yyyy-dd-gg hh:mm:ss PHP 4
Z Estrarre dati da un DB Mysql PHP 4
I database mysql estrarre due tabelle Database 2
S [PHP] Estrarre dati colonna in una stringa PHP 6
S [PHP] estrarre dati sito web protetto con username e password PHP 13
Merlina3377 [PHP] estrarre solo un determinato id da tanti con REGEXP O LIKE PHP 1
Gigi87 estrarre i dati da un forum o social network Presentati al Forum 1
trattorino Estrarre Nome Utente jquery div php PHP 9
trattorino [Javascript] estrarre id link yt Javascript 1
S [PHP] estrarre le email da un elenco di url PHP 21
T4MAR4 [PHP] estrarre tag da un testo PHP 3
T [PHP] Estrarre stringa PHP 3
G [PHP] ESTRARRE DA DB VALORE MASSIMO E MINIMO IN UN INTERVALLO IMPOSTABILE A PIACERE PHP 56
bubino8 [PHP] Estrarre dominio No Sottodomini PHP 10
L [PHP] Estrarre dati da sito web Offerte e Richieste di Lavoro e/o Collaborazione 4
sandropochi [PHP] Query per estrarre record con data successiva a quella odierna PHP 2
gandalf1959 Estrarre da un db mysql le mail, eliminando le doppie PHP 6
giancadeejay [PHP] Estrarre solo record dell'utente connesso PHP 4
U [PHP] estrarre i risultati di una query e visualizzarli in una tabella. PHP 9
S [PHP] estrarre numero da stringa PHP 5
giuseppe_123 [PHP] Estrarre giorno mese e anno da una data PHP 2

Discussioni simili