• User Newbie

    Order by ALFANUMERICO strano

    Ciao, 😉
    la situazione è questa:
    ho un database (non modificabile) in cui nel campo "premi" ci sono vari valori espressi come "text":

    1. il valore "nessun premio";
    2. il valore numerico da 20 a 40 (che sono i premi);
    3. il valore "più di 40 premi".

    Con PHP sto ordinando i risultati per numero di premi.

    Aggiungendo "ORDER BY premi + 0 DESC" ho scoperto che posso ordinare in senso alfanumerico, ovvero prima mi considera i premi da 40 a 20, ordinando in senso descrescente, quindi mi elenca i "nessuna età" a seguire. E fin qui andrebbe bene.
    Il problema è che dovrei far vedere anche i "più di 40" PRIMA dei valori "da 40 a 20", e non so come fare a livello di sintassi.
    Adesso il sistema me li pone ovviamente alla fine dell'elenco, mischiati con i "nessun premio".
    Come posso fare? :arrabbiato:

    Nota: se avessi potuto modificare il database avrei semplicemente simulato "più di 40" con il numero 41, così da ordinarmelo senza problemi.

    Attendo l'aiuto di qualche esperto PHP-SQL, grazie.

    A presto! :ciauz:


  • User

    .....
    no, era una castroneria 🙂

    Di quanti record stiamo parlando???


  • User Newbie

    Alcune migliaia di record. Ogni record è composto da centinaia di campi.

    @Texv: ho fatto in tempo a leggere la tua soluzione prima che la eliminassi:

    SELECT * FROM tabella WHERE premi="più di 40 premi" UNION SELECT * FROM tabella ORDER BY premi + 0 DESC

    Sembrava interessante. Se è vero che con UNION posso unire due query per crearne una sola che visualizzi i due elenchi di risultati di file, penso abbia senso. Ma effettivamente la seconda SELECT conterrebbe doppioni della prima.

    Tuttavia, che ne pensate di questa modifica?

    SELECT * FROM tabella WHERE premi="più di 40 premi" UNION SELECT * FROM tabella WHERE premi!="più di 40 premi" ORDER BY premi + 0 DESC


  • User

    Forse.... così dovrebbe andare, è una modifica della prima proposta che poi mi sono accorto non funzionare bene

    (SELECT * FROM database WHERE premi = 'più di 40 premi')
    UNION all
    (SELECT * FROM database WHERE premi <> 'più di 40 premi' ORDER BY premi DESC)


  • User

    devi usare UNION ALL dato che la UNION di default applica anche la clausola DISTINCT che elimina le righe duplicate.


  • User Newbie

    Curiosità: se la UNION già include DISTINCT, perché fare una UNION ALL con la clausola "WHERE premi <> 'più di 40 premi'"?


  • User

    Hai ragione, se si usa l'esclusione tramite il diverso nella seconda select è inutile la clausola ALL