- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- MySql :: ordinamento logico
-
MySql :: ordinamento logico
Mannaggia ragazzi che problma devo creare ua query che ordini prima un prodotto specifico e dopo tutto il resto... sembrerebbe nula di difficile..
questa è la querySELECT * FROM annunci ORDER BY video DESC , ID DESC LIMIT $primo, $per_page
adesso analizzanola mi ordina per primo i video e dopo il resto, come chiedevo io. il problema è che i video me li ordina alfabeticamente e non per id.. come posso ordinare prima i video per il loro id e dopo tutto il resto sempre per id?
bella sfida vero? soo disperato :x... grazie a tutti
-
se ci dici come è fatta la tabella e cosa distingue un record dall'essere video o meno forse ti aiutiamo
-
la tabella è fatta cosi:
id provincia citta **video ** altro --- --------- ------ ------- ------ Questo è un esempio... in pratica non per forza ci deve essere il video.. essendo portale di annunci.. un annuncio può contenere foto o niente..
in video devono sempre rimanere in testa a tutti gli annunci, quindi se faccio un ordinamento per id se un video è più vecchi di un annuncio normale ,questo viene scavalcato però se ordino per video mi vengono messi per nome quindi dalla A alla Z.. come posso fare che prima vengono ordinati i video e il loro id e dopo tutto il resto?
-
SELECT *
FROM annunci
ORDER BY CASE WHEN IFNULL(video, '') = '' THEN 0 ELSE 1 END DESC, ID DESC
LIMIT 0, 10occhio che se la tabella contiene centinaia di migliaia di record non è il modo migliore di fare le select, potrebbe metterci un bel pò a tirare fuori un risultato.
-
grazie saro sei stato un grandissimo... potresti anche spiegarmela la query? cosi la capirei meglio.. grazie tantissimo di avermi risolto il problema
-
@tifo-milan.it said:
grazie saro sei stato un grandissimo... potresti anche spiegarmela la query? cosi la capirei meglio.. grazie tantissimo di avermi risolto il problema
beh, c'è poco da spiegare:)
l'ordinamento per video non andava bene perchè era un ordinamento alfanumerico su N valori diversi, a te servivano solo 2 valori videoSI = 1, videoNO = 0, il tutto si traduce con un CASECASE WHEN IFNULL(video, '') = '' THEN 0 ELSE 1 END ```Quando video = '' lo conto come 0 altrimenti come 1 e ordino per il risultato di questa "trasformazione" La funzione IFNULL l'ho aggiunta perchè nn conosco la tua tabella e non so se il campo video può essere NULL, allora dico che se video è NULL contala come stringa '' altrimenti mi prendi quello che c'è in video che può essere anche stringa vuota.
IFNULL(video, '')
E' lo stesso che dire ``` video = '' OR video IS NULL ``` solo che così è più elegante.;) Aggiungo un'altra soluzione possibile: sostituire:
CASE WHEN IFNULL(video, '') = '' THEN 0 ELSE 1 END
IF(IFNULL(video, '') = '', 0, 1)