Punteggio massimo per ogni anno MYSQL

di il
10 risposte

Punteggio massimo per ogni anno MYSQL

Buongiorno a tutti,
ho un problema secondo me banalissimo, ma che non sto riuscendo a risolvere.
In pratica, ho una tabella dove vengono registrati i punteggi che gli utenti accumulano ogni anno.
Gli utenti possono cambiare in nome e numero ogni anno, la tabella è organizzata così, con chiave primaria anno, nome:

ANNO - NOME - PUNTI
1995 - Davide - 30
1995 - Pietro - 11
1995 - Alessandro - 26
1995 - Fabrizio - 14
1996 - Davide - 22
1996 - Andrea - 15
1996 - Umberto - 21
1996 - Fabrizio - 24
1996 - Giovanni - 12
1997 - Alberto - 14
1997 - Davide - 6

La mia query deve selezionarmi per ogni anno solo l'utente con il punteggio più alto, cioè:
1995 - Davide - 30
1996 - Fabrizio - 24
1997 - Alberto - 14

Ho provato a fare questa query:
SELECT anno, nome, max(punti) AS points FROM utenti GROUP BY anno
ma mi dà il seguente errore:
#1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'Sql1350147_1.premioPROVA.nome' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Aiutatemi per piacere!

10 Risposte

  • Re: Punteggio massimo per ogni anno MYSQL

    NON PUOI FARLO con una query semplice come quella che hai proposto.

    In ogni caso, TE LO DICE la segnalazione di errore QUALE E' ESATTAMENTE IL PROBLEMA!

    L' ORRORE e':
    
    SELECT anno, nome, MAX(punti) ...
    GROUP BY anno
    
    MENTRE puoi fare:
    
    SELECT anno, MAX(punti) ...
    GROUP BY anno
    
    Il perche' lo trovi sul libro su cui stai studiando.
  • Re: Punteggio massimo per ogni anno MYSQL

    migliorabile ha scritto:


    NON PUOI FARLO con una query semplice come quella che hai proposto.

    In ogni caso, TE LO DICE la segnalazione di errore QUALE E' ESATTAMENTE IL PROBLEMA!

    L' ORRORE e':
    
    SELECT anno, nome, MAX(punti) ...
    GROUP BY anno
    
    MENTRE puoi fare:
    
    SELECT anno, MAX(punti) ...
    GROUP BY anno
    
    Il perche' lo trovi sul libro su cui stai studiando.
    Premesso che non credo ci sia bisogno di rispondere in un tono così acido, visto che ho esposto il messaggio con chiarezza, gentilezza e cortesia.

    Io ho bisogno di avere anche il nome che ha realizzato quel punteggio, la soluzione che mi hai proposto non me lo dà, e ti sei pure atteggiato a professore.
    Chiedo a qualcun altro, con toni più cortesi e rispettosi, di indicarmi la soluzione o dove sto sbagliando.
    Grazie.
  • Re: Punteggio massimo per ogni anno MYSQL

    Non son certo la persona giusta per toni rispettosi

    Domanda: puoi usare "trucchetti sporchi", cioè funzioni MySQL, oppure solo SQL "liscio"?
  • Re: Punteggio massimo per ogni anno MYSQL

    Penso di aver risolto così
    SELECT a.anno, a.nome, a.punti
    FROM (
    	SELECT anno, MAX( punti ) AS maxpunti
    	FROM utenti
    	GROUP BY anno
    ) AS x
    INNER JOIN utenti AS a ON x.anno = a.anno AND a.punti = x.maxpunti
    ma mi chiedo se sia proprio indispensabile una query annidata per risolvere un problema così banale.
    Se riuscite a indicarmi una soluzione migliore, con toni cortesi preferibilmente, sarei lieto se la condivideste.

    Vi ringrazio anticipatamente e vi saluto.
  • Re: Punteggio massimo per ogni anno MYSQL

    +m2+ ha scritto:


    Non son certo la persona giusta per toni rispettosi

    Domanda: puoi usare "trucchetti sporchi", cioè funzioni MySQL, oppure solo SQL "liscio"?
    Intanto ciao e grazie per la risposta.
    Posso, ma la soluzione che proporresti col "trucchetto sporco" è più o meno complessa di quella che ho postato appena dopo il tuo messaggio che sto quotando?
  • Re: Punteggio massimo per ogni anno MYSQL

    Ueee... andiamo per ordine
    
    SELECT anno, nome, max(punti) AS points FROM utenti GROUP BY anno
    questa FUNZIONA (edit: non dà errore, non fornisce il risultato giusto, lo davo per scontato ma magari è meglio chiarirlo per chi non è abituato a mysql e cuggginivari) su MariaDB 10.x, perchè è un tipo di query che capita spesso, e l'ottimizzatore capisce cosa vuoi fare
    Provare, per credere.
    (si tratta più precisamente di ONLY_FULL_GROUP_BY)
    Attenzione dunque

    Tornando alla domanda non è una query annidata (fermo lo spiegone) e sì, suppongo che l'esercizio fosse proprio mirante a quello.
    Sei proprio sicuro che sia giusta?

    Inoltre sua sia una temporary che un filesort, insomma il peggio del peggio.

    Però, di nuovo, è un corso per principianti, dove cioè bisogna imparare da zero, o un corso avanzato, dove ci va la risposta migliore, e non solo una "qualsiasi" risposta che dia il risultato giusto?
  • Re: Punteggio massimo per ogni anno MYSQL

    +m2+ ha scritto:


    Ueee... andiamo per ordine
    
    SELECT anno, nome, max(punti) AS points FROM utenti GROUP BY anno
    questa FUNZIONA (edit: non dà errore, non fornisce il risultato giusto, lo davo per scontato ma magari è meglio chiarirlo per chi non è abituato a mysql e cuggginivari) su MariaDB 10.x, perchè è un tipo di query che capita spesso, e l'ottimizzatore capisce cosa vuoi fare
    Provare, per credere.
    (si tratta più precisamente di ONLY_FULL_GROUP_BY)
    Attenzione dunque

    Tornando alla domanda non è una query annidata (fermo lo spiegone) e sì, suppongo che l'esercizio fosse proprio mirante a quello.
    Sei proprio sicuro che sia giusta?

    Inoltre sua sia una temporary che un filesort, insomma il peggio del peggio.

    Però, di nuovo, è un corso per principianti, dove cioè bisogna imparare da zero, o un corso avanzato, dove ci va la risposta migliore, e non solo una "qualsiasi" risposta che dia il risultato giusto?
    Non sono uno studente, non è un esercizio, sto cercando di gestire alcuni dati via software per fare un albo d'oro dei migliori anno per anno e di avere i dettagli di ogni anno cliccando sull'anno di riferimento.

    La classifica della singola stagione è una banale query dove anno=$parametro_che_gli_passo , ma l'albo d'oro deve accedere alla stessa tabella e far vedere solo il migliore di ogni anno.
  • Re: Punteggio massimo per ogni anno MYSQL

    steam engenius ha scritto:


    Non sono uno studente, non è un esercizio, sto cercando di gestire alcuni dati via software per fare un albo d'oro dei migliori anno per anno e di avere i dettagli di ogni anno cliccando sull'anno di riferimento.

    La classifica della singola stagione è una banale query dove anno=$parametro_che_gli_passo , ma l'albo d'oro deve accedere alla stessa tabella e far vedere solo il migliore di ogni anno.
    Prescindendo che spero non ci sia davvero un anno=qualcosa, bensì uno statement preparato,
    allora lascia la normalissima join e bon, niente psicodrammi ad esempio con una OVER su PARTITION.
    Quanti saranno mai i dati? Pochissimi, dunque via così
  • Re: Punteggio massimo per ogni anno MYSQL

    +m2+ ha scritto:


    steam engenius ha scritto:


    Non sono uno studente, non è un esercizio, sto cercando di gestire alcuni dati via software per fare un albo d'oro dei migliori anno per anno e di avere i dettagli di ogni anno cliccando sull'anno di riferimento.

    La classifica della singola stagione è una banale query dove anno=$parametro_che_gli_passo , ma l'albo d'oro deve accedere alla stessa tabella e far vedere solo il migliore di ogni anno.
    Prescindendo che spero non ci sia davvero un anno=qualcosa, bensì uno statement preparato,
    allora lascia la normalissima join e bon, niente psicodrammi ad esempio con una OVER su PARTITION.
    Quanti saranno mai i dati? Pochissimi, dunque via così
    Allora: statemen, over e partition sono 3 termini che veramente non so cosa vogliano dire.
    I dati cresceranno di circa 10 righe l'anno, partendo dalle 50 attuali.
  • Re: Punteggio massimo per ogni anno MYSQL

    steam engenius ha scritto:


    Allora: statemen, over e partition sono 3 termini che veramente non so cosa vogliano dire.
    I dati cresceranno di circa 10 righe l'anno, partendo dalle 50 attuali.
    Direi che puoi procedere come hai fatto, non avrai problemi particolari
Devi accedere o registrarti per scrivere nel forum
10 risposte