Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Gestione LIMIT in una GROUP BY

    Buongiorno a tutti,
    spero di trovare qualcuno che mi possa aiutare: ho questa query in MySQL dove estraggo per ogni corridore i punti che ha guadagnato in ogni gara, li sommo e li ordino in modo descrescente per ottenere la classifica.

    SELECT nome, cognome, SUM(punti)
    FROM races
    WHERE gara LIKE '2005%' and punti != 0
    GROUP BY cognome, nome
    ORDER BY SUM(punti) desc, cognome, nome, gara

    Mi servirebbe poter riuscire ad estrarre\sommare solo i primi n risultati (che variano annualmente a seconda delle gare disputate).
    So che si dovrebbe usare LIMIT ma nelle subquery non viene accettato: come posso ottenere il risultato richiesto?

    Grazie a tutti per la collaborazione.

  2. #2
    non vedo subquery in quello che hai postato.

    devi pero' usare un alias per il sum(punti)

    codice:
    SELECT nome, cognome, SUM(punti) as tot
    FROM races
    WHERE gara LIKE '2005%' and punti != 0
    GROUP BY cognome, nome
    ORDER BY tot desc, cognome, nome, gara
    limit nn
    ma ti serve veramente l'ordinamento per gara dopo cognome e nome?

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Non è necessario per gara: con questa query riuscivo a fare la somma di tutti i totali.
    La subquery non esiste ma "mettevo le mani avanti" visto che su Internet ho letto che il Limit nelle subquery non viene accettato.


    Ritornando alla mia questione: rimuovendo il filtro sulla gara potrei avere qualche vantaggio per ottenere il risultato desiderato?

  4. #4
    Originariamente inviato da cyberclown72
    Non è necessario per gara: con questa query riuscivo a fare la somma di tutti i totali.
    La subquery non esiste ma "mettevo le mani avanti" visto che su Internet ho letto che il Limit nelle subquery non viene accettato.


    Ritornando alla mia questione: rimuovendo il filtro sulla gara potrei avere qualche vantaggio per ottenere il risultato desiderato?
    nella subquery magari no, ma nella mamma query si.

    Se rimuovi quello che non serve hai comunque un vantaggio.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    E quindi come dovrei modificare la mia query per ottenere il risultato richiesto?
    Io devo estrarre solo i primi n risultati per ogni concorrente, sommarli tra loro ed ordinarli per creare una classifica.
    La query da cui sono partito mi fa la somma dei punteggi e me li ordina creandomi la classifica ma non so come escludere gli ultimi n risultati dalla somma totale dei punteggi.

  6. #6
    Originariamente inviato da cyberclown72
    E quindi come dovrei modificare la mia query per ottenere il risultato richiesto?
    Io devo estrarre solo i primi n risultati per ogni concorrente, sommarli tra loro ed ordinarli per creare una classifica.
    La query da cui sono partito mi fa la somma dei punteggi e me li ordina creandomi la classifica ma non so come escludere gli ultimi n risultati dalla somma totale dei punteggi.
    Guarda che sinora non hai specificato quale sia il risultato richiesto. Non si ha nemmeno l'idea di quali siano i dati a tua disposizione. Un raggruppamento rende un solo record per ogni gruppo e non i primi nn risultati. Poi andrebbe definito numericamente quali sarebbero i primi risultati e quali gli ultimi ed anche un qualcosa che stabilisca questo periodo, cioe' una data.

    Senza conoscere il progetto rimane difficile capire che vuoi fare, anche perche' parrebbe che ti trovi una tabella con parecchi dati duplicati, almeno da quanto si puo' intendere

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Allora la situazione è la seguente:
    ho una tabella con un ID, nome, cognome, punti e gara (all'interno di questo campo - visto che la suddivisione deve avvenire per anno ogni gara è codificata AAAA01, AAAA02, AAAA03 ecc.)
    Visto che non tutti i partecipanti possono gareggiare a tutte le gare si è deciso - per livellare la classifica - di eliminare il punteggio più basso ogni quattro gare svolte (quindi se si fanno 12 gare annue bisogna togliere gli ultimi 3 punteggi minori).
    Un esempio di seguito

    Gara 1 Tizio punti 25
    Caio punti 20
    Sempronio punti 15

    Gara 2 Sempronio punti 25
    Caio punti 20
    Pluto punti 15

    Gara 3 Pippo punti 25
    Sempronio punti 20
    Caio punti 15

    Gara 4 Pluto punti 25
    Tizio punti 20
    Caio punti 15


    Estraendo con la query che postato in precedenza il risultato sarebbe il seguente

    Caio punti 70
    Sempronio punti 60
    Tizio punti 45
    Pluto punti 40
    Pippo punti 25

    Invece dovrebbe essere così: Caio punti 55 (ha partecipato a 4 gare e si toglie uno dei risultati peggiori quindi 15 punti) mentre a tutti gli altri verrebbe tolto 0 (visto che non hanno partecipato a tutte le gare e quindi il risultato peggiore sarebbe appunto uguale a 0).

    La nuova classifica dovrebbe quindi essere la seguente

    Sempronio punti 60
    Caio punti 55
    Tizio punti 45
    Pluto punti 40
    Pippo punti 25

    Ora vorrei sapere come riuscirci modificando la query postata oppure creandone una ex novo.

    Spero di essere stato più chiaro rispetto ai precedenti post.

  8. #8
    Decisamente la cosa con SQL potrebbe essere abbastanza complessa. I dati non sono sufficientemente differenziati e sopratutto vorresti escludere random alcuni risultati in modo dipendente dal numero delle partite giocate. random nel senso che non si sa a priori chi deve essere conteggiato e chi no oppure quanti devono essere esclusi.

    Bisogna quindi ordinare i record, selezionare i risultati validi escludendo gli eccedenti e poi sommare i restanti. Questo per ogni utente.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da cyberclown72
    Allora la situazione è la seguente:
    ho una tabella con un ID, nome, cognome, punti e gara (all'interno di questo campo - visto che la suddivisione deve avvenire per anno ogni gara è codificata AAAA01, AAAA02, AAAA03 ecc.)
    Visto che non tutti i partecipanti possono gareggiare a tutte le gare si è deciso - per livellare la classifica - di eliminare il punteggio più basso ogni quattro gare svolte (quindi se si fanno 12 gare annue bisogna togliere gli ultimi 3 punteggi minori).
    Un esempio di seguito

    Gara 1 Tizio punti 25
    Caio punti 20
    Sempronio punti 15

    Gara 2 Sempronio punti 25
    Caio punti 20
    Pluto punti 15

    Gara 3 Pippo punti 25
    Sempronio punti 20
    Caio punti 15

    Gara 4 Pluto punti 25
    Tizio punti 20
    Caio punti 15


    Estraendo con la query che postato in precedenza il risultato sarebbe il seguente

    Caio punti 70
    Sempronio punti 60
    Tizio punti 45
    Pluto punti 40
    Pippo punti 25

    Invece dovrebbe essere così: Caio punti 55 (ha partecipato a 4 gare e si toglie uno dei risultati peggiori quindi 15 punti) mentre a tutti gli altri verrebbe tolto 0 (visto che non hanno partecipato a tutte le gare e quindi il risultato peggiore sarebbe appunto uguale a 0).

    La nuova classifica dovrebbe quindi essere la seguente

    Sempronio punti 60
    Caio punti 55
    Tizio punti 45
    Pluto punti 40
    Pippo punti 25

    Ora vorrei sapere come riuscirci modificando la query postata oppure creandone una ex novo.

    Spero di essere stato più chiaro rispetto ai precedenti post.
    Prova così

    codice:
    set @nome := "", @num := 1;
    select nome,sum(punti) as totale from (
    select * from (
    select *,
       @num := if(@nome = nome, @num + 1, 1) as riga_numero,
       @nome := nome as pippo
    from tabella
    order by nome asc, punti desc) as tab where riga_numero <= 3) as tab
    group by nome
    order by totale desc


    edit. Se può interessarti ho preso spunto da questa mia vecchia discussione:

    http://forum.html.it/forum/showthrea...ght=tot+gruppo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.