Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478

    [MySQL] Ordinare risultati selettivamente

    Ciao a tutti ragazzi! ho bisogno del vostro aiuto per risolvere una faccenda che mi sta mandando al manicomio... Quello che vorrei ottenere è una gestione selettiva dell'ordinamento dei record estratti da più tabelle.

    Per evitare complicazioni non userò un esempio generico ma il codice che sto utilizzando al momento che mi permette di estrarre tutti i dati che mi occorrono per poi ordinarli in base alla scelta effettuata.

    Questa è la query con cui estraggo i dati, preceduta da alcune righe di codice che definiscono le variabili con cui verrà stabilito l'ordinamento:

    Codice PHP:
    $ord = empty($_GET['ord']) ? 'titolo' $_GET['ord'];
    $by = empty($_GET['by']) ? 'asc' $_GET['by'];
    $num = empty($_GET['num']) ? 10 : ((int)$_GET['num']>30
                                    
    30 : (int)$_GET['num']);

    $sql_brano paging("
    SELECT
      b.id AS bID, b.titolo, b.anno, b.note, b.genere, ge.nome AS genre,
      CONCAT_WS(' ', c.cognome, c.nome) AS compositore,
      CONCAT_WS(' ', e.cognome, e.nome) AS esecutore,
      en.nome AS ensemble
    FROM
      brani b
    LEFT JOIN brani_esecutori be ON be.id_brano = b.id
    LEFT JOIN compositori c ON c.id = b.compositore
    LEFT JOIN esecutori e ON e.id = be.id_esecutore
    LEFT JOIN ensemble en ON en.id = be.id_ensemble
    LEFT JOIN generi ge ON ge.id = b.genere
    ORDER BY
      
    $ord $by"$num) or show_error(); 
    "paging()" è la funzione per la pagionazione (by guidoz), show_error() è un'altra funzione per mostrare un messaggio personalizzato in caso di errore. Contiene ovviamente mysql_error.

    Le 3 variabili $ord, $by e $num, dopo aver estratto tutti i record, tramite un form (method get, ovviamente) mi permettono di cambiare l'ordine con cui i dati vengono visualizzati.

    Per i campi ID (identificativo del brano, bID), titolo, anno, genere, compositore non ci sono problemi! tutto funziona come previsto, l'ordinamento viene fatto correttamente sia in modo crescente che descrescente (asc, desc).

    Il problema si verifica solo con i campi esecutore ed ensemble.

    Quello che accade quando chiedo di ordinare i risultati per esecutore in modo crescente è che i dati si mostrano ordinati PRIMA in base al campo ensemble in modo decrescente e poi secondo la richiesta originaria, cioè "esecutore asc". Se invece chiedo un'ordinamento decrescente in base al campo "esecutore", tutto funziona correttamente. Vengono mostrati prima tutti i dati, in modo decrescente, appartenenti al gruppo "esecutore" e successivamente gli altri dati del gruppo "ensemble", sempre in modo decrescente.

    Allo stesso modo, quando tento di ordinare i record in base al campo "ensemble", in modo crescente, mi vengono restituiti PRIMA tutti i dati relativi al gruppo "esecutore" (sempre in modo crescente, asc) e alla fine compaiono i record "ensemble" (sempre in modo asc). Se chiedo, infine, di ordinare i valori con "ensemble, desc" tutto funziona in maniera esatta! Vengono mostrati prima i valori "ensemble" (in modo desc) e dopo quelli di "esecutore", sempre desc.

    Io vi giuro che non riesco proprio a capacitarmi di una simile anomalia! Non saprei proprio da cosa dipende un comportamente così, forse dalla struttura errata delle tabelle nel database (se volete vi posto anche quella) e di conseguenza dalla costruzione incorretta della query? Oppure, ammesso che la query sia estatta, da un errato richiamo dei nomi dei campi?

    Potreste darmi una mano, per favore, ad aiutarmi a risolvere questa situazione? Vi ringrazio. Scusatemi se la spiegazione del problema è stata un po' lunga... Confido nel vostro aiuto!

  2. #2
    miracoli e' da un bel po' che sono terminati nel software.....

    stampa la query e verifica cosa risolvono le variabili.

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

  3. #3
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Ho stampato la query, le variabili riportano esattamente i valori attesi, nel senso che dal form per l'ordinamento se nella select box di nome "ord" scelgo di visualizzare i dati ordinati in base all'anno, la variabile $ord contiene giusto il valore "anno".

    Questo valore poi si aggiunge al termine della query e l'ordinamento avviene in base al valore selezionato, quindi per anno nel caso dell'esempio precedente. Così per tutti gli altri valori, titolo, genere, compositore, etc...

    Cos'altro devo fare? Grazie

  4. #4
    Originariamente inviato da neida

    Cos'altro devo fare? Grazie
    provare senza lo spazio che metti come primo carattere in concat(), tra l'altro ... che ci fa?

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

  5. #5
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Nulla. Ho provato ad eliminare lo spazio come mi hai suggerito di fare, ma niente! Stesso identico risultato per i soli campi "esecutore" ed "ensemble".

    Ah, lo spazio mi serviva per distanziare i due valori estratti. Del resto credo che sia proprio concat_ws che consente di disporre di un carattere "separatore" tra i valori da concatenare. Cosa che non accade con il semplice concat()...

    Ma la cosa che proprio non riesco a spiegarmi è questa assurda anomalia che si verifica SOLO con quei DUE campi. Se la query non fosse corretta dovrebbero esserci problemi fin dall'inizio. E invece solo quando cerco di ordinare i risultati in base a quei 2 valori si incasinano le cose! Perchè?







    . <- adotta una query funzionante.

    ( bellissimo il tuo ultimo slogan! )

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120

    Re: [MySQL] Ordinare risultati selettivamente

    Toh chi si rivede, gli ensemble!!!

    Originariamente inviato da neida
    Quello che accade quando chiedo di ordinare i risultati per esecutore in modo crescente è che i dati si mostrano ordinati PRIMA in base al campo ensemble in modo decrescente e poi secondo la richiesta originaria, cioè "esecutore asc". Se invece chiedo un'ordinamento decrescente in base al campo "esecutore", tutto funziona correttamente. Vengono mostrati prima tutti i dati, in modo decrescente, appartenenti al gruppo "esecutore" e successivamente gli altri dati del gruppo "ensemble", sempre in modo decrescente.
    Se non capisco male quelli che ti fa vedere per primi (in caso di ordinamento ascendente) sono quelli con esecutore NULL. Quindi non ci trovo niente di anomalo.
    Originariamente inviato da neida
    Allo stesso modo, quando tento di ordinare i record in base al campo "ensemble", in modo crescente, mi vengono restituiti PRIMA tutti i dati relativi al gruppo "esecutore" (sempre in modo crescente, asc) e alla fine compaiono i record "ensemble" (sempre in modo asc). Se chiedo, infine, di ordinare i valori con "ensemble, desc" tutto funziona in maniera esatta! Vengono mostrati prima i valori "ensemble" (in modo desc) e dopo quelli di "esecutore", sempre desc.
    Idem come sopra

  7. #7
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478

    Re: Re: [MySQL] Ordinare risultati selettivamente

    Originariamente inviato da luca200
    Toh chi si rivede, gli ensemble!!!

    [...]
    Ehilà!! spilungone!! (spero mi passerai il vezzeggiativo...)


    Eh, si! ancora con 'sti benedetti ensemble!
    Allora, stando a quanto affermi relativamente ai valori NULL, il comportamento così come l'ho descritto prima è più che giusto? mmmh, e non si può fare qualcosa per ovviare a questa "normalità" nell'ordinamento dei dati?

    Grazie (tantissimo) per il chiarimento! Ciao

  8. #8
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    (uuup!)

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Magari potresti spiegare esattamente cosa vuoi ottenere

  10. #10
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478

    Re: [MySQL] Ordinare risultati selettivamente

    Ciao! scusami, hai ragione, forse non ho spiegato chiaramente lo scopo della cosa. Vedi, come cercavo di dire nel primo messaggio:

    Originariamente inviato da neida
    Quello che accade quando chiedo di ordinare i risultati per esecutore in modo crescente è che i dati si mostrano ordinati PRIMA in base al campo ensemble in modo decrescente e poi secondo la richiesta originaria, cioè "esecutore asc". Se invece chiedo un'ordinamento decrescente in base al campo "esecutore", tutto funziona correttamente. Vengono mostrati prima tutti i dati, in modo decrescente, appartenenti al gruppo "esecutore" e successivamente gli altri dati del gruppo "ensemble", sempre in modo decrescente.

    Allo stesso modo, quando tento di ordinare i record in base al campo "ensemble", in modo crescente, mi vengono restituiti PRIMA tutti i dati relativi al gruppo "esecutore" (sempre in modo crescente, asc) e alla fine compaiono i record "ensemble" (sempre in modo asc). Se chiedo, infine, di ordinare i valori con "ensemble, desc" tutto funziona in maniera esatta! Vengono mostrati prima i valori "ensemble" (in modo desc) e dopo quelli di "esecutore", sempre desc.
    vorrei che l'ordinamento, limitatamente ai due campi in questione, avvenisse rispettando l'ordine di visualizzazione richiesto.

    Quindi, se chiedo una disposizione dei risultati in modo crescente in base al campo "esecutore", vorrei poter leggere PRIMA tutti i dati relativi a "esecutore" (asc) e DOPO quelli appartenenti al campo "ensemble". Idem per il campo "ensemble" in modo crescente, PRIMA tutti i valori del campo ensemble e successivamente quelli legati al campo esecutore.

    Potresti aiutarmi, per favore? Grazie!

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.