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

    Una query per tabelle unite

    Devo eseguire una query un po' complessa e non so come fare.
    Brevemente la struttura del database sulla quale intervengo sono tre tabelle:

    Tabella "cd":
    mi dice diversi dati supplementari del cd ed è collegato alle tabelle tramite id

    Tabella "cd_musicisti_autori":
    è una tabella di collegamento tra la tabella "cd" e la tabella "musicisti", i campi sono
    "id_cd" ed "id_musicisti"

    Tabella "musicisti":
    contiene i campi "id", "nome", "cognome" ed è collegata alla tabella "cd" tramite la seconda tabella, in questo modo ogni cd può avere più di un autore.

    La query che voglio deve poter selezionare i cd che abbiano per autore un certo musicista, il cui nome è contenuto in una variabile che chiamo $_NOME.
    Io ho provato a fare una query così:
    Codice PHP:
    $query"SELECT * FROM cd 
        WHERE (
            SELECT m.nome, m.cognome
            FROM musicisti m
            JOIN cd_musicisti_autori cd_m_a 
            ON cd_m_a.id_musicisti = m.id
            WHERE cd_m_a.id_cd = id"
    ;
            ) 
        
    LIKE '%$_NOME%' "; 
    Il criterio è scorrere la lista dei cd e per ogni cd individuare tramite la query annidata il nome ed il cognome del o degli autori per confrontarli poi nella prima query con il nome ricercato.
    La query annidata mi da errore:


    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT m.nome, m.cognome FROM musicisti m JOIN cd_musicisti_au' at line 1

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    select cd.*
    from cd
    inner join cd_musicisti_autori as cma
    on cd.id = cma.id_cd
    inner join musicisti m
    on cma.id_musicisti = m.id
    where m.nome = 'mario' and m.cognome = 'rossi'

  3. #3
    Funziona!!! E' già un buon risultato.
    Ora mi chiedevo se è possibile inserire altri JOIN dopo WHERE - temo di no - perchè se non è possibile mi complica molto la vita, dato che la query cambia in base ai settaggi del motore di ricerca che voglio creare.
    Grazie dell'aiuto.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    In base ai parametri che vengono inseriti nel form ti crei dinamicamente la tua condizione di ricerca e passi quella stringa come where.

  5. #5
    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"

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da giancarlo75
    se dovessi creare una query completa per ogni casistica non me la cavo più
    Non devi creare una query per ogni possibile alternativa ma la devi generare dinamicamente in base ai parametri passati.

    Per farti un'idea dai uno sguardo a questo thread

    http://forum.html.it/forum/showthrea...readid=1276934

  7. #7
    Ho visto il thread, a quanto pare è abbastanza complicato.
    Ma quindi mi stai dicendo che il mio modo di procedere, fino ad ora, è quello corretto?
    O sbaglio ad interpretarti?

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Il procedimento è lo stesso indicato nel thread. Recuperi tutte le informazioni ricevute tramite form e le concateni per generare la tua stringa d'interrogazione, senza usare tutti quei case.

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.