Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di JoeP
    Registrato dal
    May 2004
    Messaggi
    558

    [MySQL] Selezione su campo calcolato

    Ciao a tutti, ho una query del tipo:

    SELECT id, nome, cognome, IF(eta = 0, 'Età non specificata', eta) AS eta
    FROM persone
    WHERE eta < 30

    Il campo eta fa parte della tabella, e se è a zero significa che non è stata specificata. Quindi non prendo quel campo nelle SELECT, ma un campo calcolato con un IF() che poi rinomino come eta. Facendo così però non posso fare la restrizione con il WHERE, perchè il comando WHERE vuole solo campi originari della tabella, e non calcolati. Come posso fare?

    Dalla documentazione:
    It is not allowable to use a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed.

  2. #2

    Re: [MySQL] Selezione su campo calcolato

    Originariamente inviato da JoeP
    Ciao a tutti, ho una query del tipo:

    SELECT id, nome, cognome, IF(eta = 0, 'Età non specificata', eta) AS eta
    FROM persone
    WHERE eta < 30

    Il campo eta fa parte della tabella, e se è a zero significa che non è stata specificata. Quindi non prendo quel campo nelle SELECT, ma un campo calcolato con un IF() che poi rinomino come eta. Facendo così però non posso fare la restrizione con il WHERE, perchè il comando WHERE vuole solo campi originari della tabella, e non calcolati. Come posso fare?

    Dalla documentazione:
    It is not allowable to use a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed.
    Non e' buona norma comunque sia, utilizzare lo stesso nome campo per un nome alias. Non sarebbe pure corretto, ben fosse ammesso, paragonare la stringa 'Età non specificata' come < 0.

    non si capisce se vuoi anche il record quando e' zero cioe' come 'Età non specificata'.

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

  3. #3
    Utente di HTML.it L'avatar di JoeP
    Registrato dal
    May 2004
    Messaggi
    558
    Era per fare un esempio semplificato, il realtà la restrizione è poco più complessa, e anche la condizione dell'IF. Ma questo non ha importanza. Ho necessità di tenere il nome del campo calcolato uguale a quello della tabella (che comunque non prendo nella lista dopo SELECT, quindi ambiguità non ci sono) altrimenti dovrei cambiare in molti punti di molte pagine il codice PHP (uso array associativi tipo $record['eta'] per leggere i risultati delle query).

    Sto leggnedo la documentazione relativa a HAVING ma non capisco bene come funziona.

  4. #4
    Utente di HTML.it L'avatar di JoeP
    Registrato dal
    May 2004
    Messaggi
    558
    Ho risolto passando un po' di tempo sulla documentazione ufficiale. Uso GROUP BY ... HAVING, raggruppando per id (quindi un finto raggruppamente) e poi usando HAVING per scpecificare la condizione eta < 30. Avevo provato anche prima, ma mi dava sempre errore perchè SQL vuole che GROUP BY ... HAVING sia obbligatoriamente dopo le altre restrizioni specificate con WHERE, e che ORDER BY sia dopo il GROUP BY ... HAVING se voglio ordinare i valori secondo il campo su cui HAVING opera la restrizione...
    :rollo: :rollo: :rollo:

    Tutto a posto ora, grazie lo stesso.

  5. #5
    Originariamente inviato da JoeP
    Era per fare un esempio semplificato, il realtà la restrizione è poco più complessa, e anche la condizione dell'IF. Ma questo non ha importanza. Ho necessità di tenere il nome del campo calcolato uguale a quello della tabella (che comunque non prendo nella lista dopo SELECT, quindi ambiguità non ci sono) altrimenti dovrei cambiare in molti punti di molte pagine il codice PHP (uso array associativi tipo $record['eta'] per leggere i risultati delle query).

    Sto leggnedo la documentazione relativa a HAVING ma non capisco bene come funziona.
    Scusa, ma mi suona male la cosa..... siccome il where viene applicato "prima" della selezione l'alias non e' determinato ma il nome del campo "eta" si. Se il campo "eta" non ci fosse come reale ma solo come alias, allora capirei che non e' ancora definito....

    dovrebbe funzionare cosi....

    risolve il nome tabella
    raccoglie i record che rispondono alla condizione where
    seleziona i campi richiesti
    applica se richiesto il raggruppamento


    Forse il tutto si potrebbe comprendere con la query reale.

    HAVING si usa per selezionare ulteriormente dei record dopo la scelta del where. Si usa solitamente con group by


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

  6. #6
    Utente di HTML.it L'avatar di JoeP
    Registrato dal
    May 2004
    Messaggi
    558
    E' corretto tutto quello che dici. Forse mi sono espresso male. E' vero, le restrizioni in WHERE vengono calcolate prima dei campi calcolati, quindi eta esiste, ma è quello originario della tabella. Infatti io il mio WHERE eta < 30 è stato stostiuto dall'HAVING eta < 30. Ho dovuto comunque usare il WHERE per altre restrizioni che non avevo messo nell'esempio iniziale

    In pratica ora ho una cosa del genere:
    SELECT id, nome, cognome, IF(eta = 0, 'Età non specificata', eta) AS eta
    FROM persone
    WHERE [condizioni che non riguardano l'età]
    GROUP BY id HAVING eta < 30
    ORDER BY eta
    LIMIT 0, 30

    Il problema era se cambiavo l'ordine di WHERE/GROUP BY...HAVING/ORDER BY... Io credevo di avere un problema altrove, mentre era l'ordine incorretto...

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.