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!