Il problema è che voglio un motore di ricerca abbastanza complesso a vantaggio della sua utilità.

Il form di ricerca è strutturato così:

1) c'è una casella di testo che può essere cercato in uno solo dei seguenti campi:
titolo
autore
musicista
commento
in prestito a
prestato da

2) c'è la possibilità di aggiungere uno dei seguenti campi nella ricerca (caselle a discesa a singola selezione)
etichetta
genere
giudizio

3) la ricerca si può ordinare per:
anno
giudizio
titolo (ordine alfabetico)
e l'ordine può essere ascendente o discendente

Di questi punti per ora ho risolto 1) e 3), se dovessi creare una query completa per ogni casistica non me la cavo più, per ora il codice è questo, che riporto solo a titolo di esempio per far vedere che ho variato la query solo in alcuni punti a seconda dei valori postati (che sono inseriti in sessione per evitare di doverli ritrasmettere in caso di paginazione dei risultati):
Codice PHP:
$query="SELECT c.* FROM cd c ";
if (!empty(
$_SESSION['principale'])&&$_SESSION['principale']!="") {
                        switch (
$_SESSION[ricerca]) {
                            case 
"titolo":
                            
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
                            break;
                            case 
"commento":
                            
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
                            break;
                            case 
"prestito":
                            
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
                            break;
                            case 
"in_prestito":
                            
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
                            break;
                            case 
"autore":
                            
$query.="INNER JOIN cd_musicisti_autori cd_m_a
                                    ON c.id = cd_m_a.id_cd
                                    INNER JOIN musicisti m
                                    ON cd_m_a.id_musicisti = m.id
                                    WHERE LOWER(m.nome) LIKE '%
$_SESSION[principale]%'
                                    OR
                                    LOWER(m.cognome) LIKE '%
$_SESSION[principale]%'";
                            break;
                            case 
"musicista":
                            
$query.="INNER JOIN cd_musicisti cd_m
                                    ON c.id = cd_m.id_cd
                                    INNER JOIN musicisti m
                                    ON cd_m.id_musicisti = m.id
                                    WHERE LOWER(m.nome) LIKE '%
$_SESSION[principale]%'
                                    OR
                                    LOWER(m.cognome) LIKE '%
$_SESSION[principale]%'";
                            break;
                        }
                    }
$query.="ORDER BY $_SESSION[ordine] $_SESSION[ordine2] ";
$query.="LIMIT $primo$per_page"