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

    inner join su tre tabelle

    Non riesco a formulare una query con un inner join su tre tabelle

    In pratica la situazione è la seguente.
    Le tabelle sono tre: libri, capitoli, paragrafi

    libri:
    id_libro (AI) | nome_libro

    capitoli:
    id_capitolo (AI) | id_libro | nome_capitolo

    paragrafi:
    id_paragrafo (AI) | id_libro | id_capitolo | nome_paragrafo | testo_paragrafo


    In pratica vorrei fare una query che estragga:
    1) nome del libro
    2) nome del capitolo
    3) lista dei paragrafi di uno dei capitoli (il cui id l'ho inviato via get) di uno dei libri

  2. #2
    La query potrebbe essere questa anche se a dire la verità non ho capito proprio niente di ciò che volevi:

    SELECT libri.nome_libro,capitoli.nome_capitolo,paragrafi. nome_paragrafo FROM libri
    INNER JOIN capitoli ON libri.id_libro=capitoli.id_libro
    INNER JOIN paragrafi ON capitoli.id_capitolo=paragrafi.id_capitolo
    WHERE capitoli.id_capitolo=$id_capitolo

  3. #3
    si... la query è questa!!

    grz... solo che adesso mi sono sorti altri problemi... (che non sò spiegare).

    In realtà era un esempio... Ho un menu di un sito con delle voci (i "libri")
    ciascuna voce ha diversi argomenti (i "capitoli")
    e ciascun argomento diversi articoli (i "paragrafi")

    ad esempio HTML.IT ha il seguente menu: "html", "php", "javascript"

    ciascuna di queste voci poi al suo interno ha degli argomenti; ad esempio la voce php ha i seguenti argomenti: "sicurezza nel php", "sistemi di login", etc.

    ciascuno di tali argomenti ha dei paragrafi; ad esempio l'argomento "sicurezza nel php" avrà le seguenti voci: "validazione dei campi", "sqj injection", etc etc

  4. #4
    Praticamente devi fare un menu che si carica in base ai contenuti presenti nel database se non ho capito male del tipo:


    Libro 1
    Libro 2
    + Capitolo 1
    + Capitolo 2
    + Capitolo 3
    Libro 3
    + Capitolo 1
    +++ Paragrafo 1
    +++Paragrafo 2
    + Capitolo 2
    + Capitolo 3


    Praticamente quando espandi un libro vuoi caricare dal database i suoi capitoli ed espandendo questi ultimi vuoi espandere i paragrafi o no?

  5. #5
    è (più o meno) esattamente così!!!

    il mio problema sta nel fatto che possono esserci voci "libri" e/o "capitoli" che al loro interno ancora non hanno dei praragrafi:
    in tal caso vorrei far uscire un messaggio "in questo capitolo non sono presenti dei paragrafi";

    Tuttavia la query fatta in precedenza non funziona... avrei anche risolto ma con una soluzione poco "elegante"... la riporto giusto per la cronaca (anche se non se pò vedè):

    Codice PHP:
    $capitoli= (INT) $_GET['capitoli']; //ricevo la variabile

    include("../resource/conn.php"); //includo connesisone e funzione filtro_db

    /*faccio la query*/
    $query "
        SELECT capitoli.*, paragrafi.*, libri.* 
        FROM libri 
        INNER JOIN paragrafi 
            ON paragrafi.id_libro=libri.id_libro 
        INNER JOIN capitoli 
            ON paragrafi.id_capitolo=capitoli.id_capitolo AND capitoli.id_capitolo='"
    .$capitoli."'";

    $result mysql_query($query);

    if(!
    $result)
        {
        
    $lista_contenuti "errore di forumulazione della richiesta";
        }
    else
        {
    /*se non ci sono i paragrafi faccio un'altra query (ulteriore e poco elegante)*/
    /*in questo caso dato che già sò l'inesistenza di paragrafi (mysql_num_rows=0) 
    non metto i paragrafi nella query*/
        
    if(mysql_num_rows($result)==0)
            {
            
    $lista_contenuti "non ci sono paragrafi per tale argomento";
            
    $query ="SELECT capitoli.*, libri.* FROM libri INNER JOIN capitoli ON capitoli.id_libro=libri.id_libro AND capitoli.id_capitolo='".$capitoli."'";
            
    $result mysql_query($query);
            if(!
    result)
                {
                
    $lista_contenuti "errore di forumulazione della richiesta";
                }
            else
                {
                                          
    /*estraggo i valori della seconda query*/
                
    while ($riga mysql_fetch_array($result))
                    {
                    
    $nome_libro $riga['nome_libro'];
                    
    $id_libro $riga['id_libro'];
                    
    $nome_capitolo $riga['nome_capitolo'];
                    }
                }
            }
        else
            {
                             
    /*estraggo i valori della prima query*/
            
    while ($riga mysql_fetch_array($result))
                {
                
    $nome_libro $riga['nome_libro'];
                
    $id_libro $riga['id_libro'];
                
    $nome_capitolo $riga['nome_capitolo'];
                
    $lista_contenuti .= "<a href=vedi_parag.php?id_parag=".$riga['id_paragrafo'].">".$riga['titolo_paragrafo']."</a>
    "
    ;
                }
            }
        } 
    In pratica cmq vanno le cose io estrarrò 3 variabili:
    - $nome_libro;
    - $nome_capitolo (il cui id invio via get);
    - $lista_contenuti (lista dei paragrafi del capitolo).

  6. #6
    Effettivamente è molto contorta come soluzione...La potresti pensare molto meglio...Magari ti potresti portare sia l'id del libro che l'id del capitolo per $_GET e poi impostare 1 sola query per ogni occasione!

    Secondo me se la pensi meglio e la fai più semplice poi la potrai adottare in più casi e includerla con un include()..

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