Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Eseguire ricerche incrociate

    Non è facile ma cercherò di essere chiaro nell'esporre il mio problema.
    Si tratta di costruire un motore di ricerca.

    Ora il motore ha solo un campo di testo il cui valore può essere riferito ad un dato nel database, a discrezione dell'utente.
    Per esempio l'utente cerca "tromba" e vuole che tale dato sia riferito allo strumento.
    Il motore allora prima seleziona gli strumenti e poi esegue la clausola WHERE per vedere se tra questi vi è lo strumento "tromba".
    Chiaramente l'utente può anche cercare "Miles Davis" ed allora non vuole che tale stringa sia riferita allo strumento, ma al musicista: il motore allora agisce di conseguenza selezionando tutti i musicisti e poi confrontandoli attraverso WHERE con la stringa ricercata.

    Io vorrei avere un altra stringa di ricerca simile alla prima, perchè ad esempio voglio trovare tutti i cd dove Miles Davis suona le tastiere (orribile bestemmia) ed allora nel primo campo inserisco "Miles Davis" riferito al musicista, nel secondo inserisco "tastiere" riferito allo strumento.
    In tal caso il motore dovrebbe prima cercare tra i musicisti se c'è Miles Davis, poi cercare tra gli strumento suonati da Miles se ci sono le tastiere.
    Purtroppo per far questo ho bisogno di una prima ricerca, un primo WHERE, una seconda ricerca ed un secondo WHERE. Ma mysql non mi permette di eseguire ulteriori ricerche dopo WHERE, per cui non so come fare ad eseguire la seconda ricerca.

    Spero sia abbastanza chiaro il concetto, ma inserisco anche uno stralcio del codice così da capirci meglio.

    Codice PHP:
    if (!empty($_SESSION['principale'])&&$_SESSION['principale']!="") {
                            switch (
    $_SESSION[ricerca]) {
                                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 concat(m.nome,' ',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 concat(m.nome,' ',m.cognome) LIKE '%
    $_SESSION[principale]%' ";
                                break;
                                case 
    "strumento":
                                
    $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
                                        INNER JOIN musicisti_strumenti = m_str
                                        ON m.id = m_str.id_musicisti
                                        INNER JOIN strumenti = str
                                        ON str.id = m_str.id_strumenti
                                        WHERE str.strumento LIKE '%
    $_SESSION[principale]%' ";
                                break;
                                case 
    "traccia":
                                
    $query.="INNER JOIN cd_tracce cd_tr
                                        ON c.id = cd_tr.id_cd 
                                        WHERE cd_tr.traccia LIKE '%
    $_SESSION[principale]%' ";
                                break;
                                case 
    "autore_tracce":
                                
    $query.="INNER JOIN cd_tracce cd_tr
                                        ON c.id = cd_tr.id_cd
                                        INNER JOIN tracce_autori_tracce t_a_t
                                        ON cd_tr.id = t_a_t.id_cd_tracce
                                        INNER JOIN autori_tracce au_tr
                                        ON t_a_t.id_autori_tracce = au_tr.id
                                        WHERE concat(au_tr.nome,' ',au_tr.cognome) LIKE '%
    $_SESSION[principale]%' ";
                                break;
                                default:
                                
    $query.="WHERE $_SESSION[ricerca] LIKE '%$_SESSION[principale]%' ";
                                break;
                            }
        
    $unione="AND ";
    } else {
        
    $unione="WHERE ";
    }

    if (!empty(
    $_SESSION['secondaria'])&&$_SESSION['secondaria']!="") {
                            switch (
    $_SESSION[ricerca_secondaria]) {
                                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 concat(m.nome,' ',m.cognome) LIKE '%
    $_SESSION[secondaria]%' ";
                                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 concat(m.nome,' ',m.cognome) LIKE '%
    $_SESSION[secondaria]%' ";
                                break;
                                case 
    "strumento":
                                
    $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
                                        INNER JOIN musicisti_strumenti = m_str
                                        ON m.id = m_str.id_musicisti
                                        INNER JOIN strumenti = str
                                        ON str.id = m_str.id_strumenti
                                        WHERE str.strumento LIKE '%
    $_SESSION[secondaria]%' ";
                                break;
                                case 
    "traccia":
                                
    $query.="INNER JOIN cd_tracce cd_tr
                                        ON c.id = cd_tr.id_cd 
                                        WHERE cd_tr.traccia LIKE '%
    $_SESSION[secondaria]%' ";
                                break;
                                case 
    "autore_tracce":
                                
    $query.="INNER JOIN cd_tracce cd_tr
                                        ON c.id = cd_tr.id_cd
                                        INNER JOIN tracce_autori_tracce t_a_t
                                        ON cd_tr.id = t_a_t.id_cd_tracce
                                        INNER JOIN autori_tracce au_tr
                                        ON t_a_t.id_autori_tracce = au_tr.id
                                        WHERE concat(au_tr.nome,' ',au_tr.cognome) LIKE '%
    $_SESSION[secondaria]%' ";
                                break;
                                default:
                                
    $query.="WHERE $_SESSION[ricerca_secondaria] LIKE '%$_SESSION[secondaria]%' ";
                                break;
                            }
        
    $unione="AND ";
    } else {
        
    $unione="WHERE ";

    Grazie a chiunque voglia aiutarmi, se non altro per la pazienza d'aver letto questa lunga elucubrazione.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    anticipo che non ho analizzato il codice postato... sarebbe utile vedere la struttura del db...

    le due condizioni devi metterle insieme per esempio con un AND (se i dati sono nella stessa tabella) o con delle condizioni sul JOIN e con SELECT annidate, tipo: SELECT * FROM elenco WHERE ((strumento LIKE 'zufolo') AND (musicista IN (SELECT * FROM musicisti WHERE nome LIKE 'Bongo Smith'))) (il codice è solo un esempio per riferimento!!)

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 © 2026 vBulletin Solutions, Inc. All rights reserved.