Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[MySQL] Eseguire una divisione all'interno di una select

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[MySQL] Eseguire una divisione all'interno di una select

Messaggioda Rumez » gio dic 07, 2006 1:21 pm

Ciao ho un problema che mi affligge con una select nel mio sito del Fantacalcio. Per la cronaca si tratta della Select che ritorna i 5 migliori attaccanti del torneo ordinati per media voto.
[nota] Il calcolo che viene eseguito è il punteggio totale realizzato dal calciatore diviso il numero di giornate giocate dal calciatore. ( punteggio / num_giornate )
[nota] Il punteggio e il numero giornate vengono calcolati con delle sotto select

Il problema avviene quando eseguo la divisione..mi spiego meglio con del codice:
Codice: Seleziona tutto
SELECT
       calciatore.id_calciatore as id,
       calciatore.nome,
       calciatore.cognome,
       (select distinct count(formazione.id_giornata)
        from
            formazione
        where
             formazione.id_campionato = 1
             and formazione.id_calciatore = id
             and formazione.punteggio is not null) as n_giornate,
       sum(formazione.punteggio) as punteggio,
       ( punteggio / n_giornate ) as media_voto
FROM
    calciatore
    LEFT OUTER JOIN formazione
         ON formazione.id_calciatore = calciatore.id_calciatore
WHERE
     formazione.id_campionato= 1
     and calciatore.ruolo = 'A'
GROUP BY formazione.id_campionato,formazione.id_calciatore
ORDER BY media_voto DESC, cognome ASC
LIMIT 5

eseguendo questa query il compilatore mysql mi genera questo errore:
Codice: Seleziona tutto
Unwknown column 'n_giornate' in 'field_list'

boh...non ho idea del motivo visto che la colonna è presente..

Visto che non ne uscivo ho trasformato la query in questo modo:
Codice: Seleziona tutto
SELECT
       calciatore.id_calciatore as id,
       calciatore.nome,
       calciatore.cognome,
       sum(formazione.punteggio) as punteggio,
       ( punteggio / (select distinct count(formazione.id_giornata)
        from
            formazione
        where
             formazione.id_campionato = 1
             and formazione.id_calciatore = id
             and formazione.punteggio is not null) ) as media_voto
FROM
    calciatore
    LEFT OUTER JOIN formazione
         ON formazione.id_calciatore = calciatore.id_calciatore
WHERE
     formazione.id_campionato= 1
     and calciatore.ruolo = 'A'
GROUP BY formazione.id_campionato,formazione.id_calciatore
ORDER BY media_voto DESC, cognome ASC
LIMIT 5

In questo modo il numero di giornate viene calcolato direttamente al momendo dellla divisione..
Ora la query funziona ma la divisione (operatore "/") mi ritorna risultati sbagliatissimi.

Avete qualche consiglio?
Avatar utente
Rumez
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 1783
Iscritto il: mar mag 13, 2003 2:08 pm

Messaggioda Rumez » gio dic 07, 2006 5:20 pm

Risolto...
Avatar utente
Rumez
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 1783
Iscritto il: mar mag 13, 2003 2:08 pm

Messaggioda Ices_Eyes » gio dic 07, 2006 7:24 pm

Come come come??? [:-D]
Avatar utente
Ices_Eyes
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5543
Iscritto il: ven ott 24, 2003 10:37 am
Località: Prov. di Venezia

Messaggioda Rumez » gio dic 07, 2006 8:38 pm

praticamente invece di calcolare i due campi (punteggio, num_giornate) separatamente e poi fare la divisione...ho messo direttamente le due sottoselect come argomenti dell'operazione..
magia..e tutto funziona..
per la cronaca..
Codice: Seleziona tutto
SELECT
       calciatore.id_calciatore as id,
       calciatore.nome,
       calciatore.cognome,
       (select distinct count(formazione.id_giornata)
       from
           formazione
       where
            formazione.id_campionato = 1
            and formazione.id_calciatore = id
            and formazione.punteggio is not null) as n_giornate,
            round( ( sum(formazione.punteggio)  / (select distinct count(formazione.id_giornata)
                                                   from
                                                            formazione
                                                   where
                                                            formazione.id_campionato = 1
                                                            and formazione.id_calciatore = id
                                                            and formazione.punteggio is not null) ), 2 ) as media_voto
FROM
    calciatore
    LEFT OUTER JOIN formazione
         ON formazione.id_calciatore = calciatore.id_calciatore
WHERE
     formazione.id_campionato= 1
     and calciatore.ruolo = 'D'
GROUP BY formazione.id_campionato,formazione.id_calciatore
HAVING n_giornate > 5
ORDER BY media_voto DESC, cognome ASC
LIMIT 5


per l'anno prossimo vi suggerirò anche l'indirizzo del sito...visto che ha bisogno di un po' di test..
Avatar utente
Rumez
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 1783
Iscritto il: mar mag 13, 2003 2:08 pm


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising