- Home
- Categorie
- Coding e Sistemistica
- PHP
- Order by ALFANUMERICO strano
-
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":- il valore "nessun premio";
- il valore numerico da 20 a 40 (che sono i premi);
- 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?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!
-
.....
no, era una castroneriaDi quanti record stiamo parlando???
-
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
-
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 * FROMdatabase
WHERE premi <> 'più di 40 premi' ORDER BY premi DESC)
-
devi usare UNION ALL dato che la UNION di default applica anche la clausola DISTINCT che elimina le righe duplicate.
-
Curiosità : se la UNION già include DISTINCT, perché fare una UNION ALL con la clausola "WHERE premi <> 'più di 40 premi'"?
-
Hai ragione, se si usa l'esclusione tramite il diverso nella seconda select è inutile la clausola ALL