• Bannato User Attivo

    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 query

    SELECT * 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


  • Bannato User Attivo

    se ci dici come è fatta la tabella e cosa distingue un record dall'essere video o meno forse ti aiutiamo 😉


  • Bannato User Attivo

    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?


  • Bannato User Attivo

    SELECT *
    FROM annunci
    ORDER BY CASE WHEN IFNULL(video, '') = '' THEN 0 ELSE 1 END DESC, ID DESC
    LIMIT 0, 10

    occhio 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.


  • Bannato User Attivo

    grazie saro sei stato un grandissimo... potresti anche spiegarmela la query? cosi la capirei meglio.. grazie tantissimo di avermi risolto il problema


  • Bannato User Attivo

    @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 CASE

    CASE 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)