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

    Due query annidate e in relazione...???

    Ciao a tutti,
    stavo facendo uno script per stampare a video il contenuto di due tabella MYSQL che dovrebbero essere messe in relazione fra di loro.
    Provo a spiegarmi meglio con un esempio.

    Supponiamo le seguenti tabelle mysql:

    codice:
    Tabella: categoria
    
    id_cat | nome_categoria |

    codice:
    Tabella: sub_categoria
    
    id_subcat | id_categoria | nome_subcategoria |
    la tabella sub_categoria è messa in relazione con la tabella categoria per mezzo del campo id_categoria presente nella tabella sub_categoria il quale campo sarà uguale al campo id_cat della tabella categoria

    Esempio chiarificatore:
    codice:
    Tabella: categoria
    id_cat=1 | nome_categoria= CATEGORIA A |
    id_cat=2 | nome_categoria= CATEGORIA B |
    id_cat=3 | nome_categoria= CATEGORIA C |
    
    Tabella: sub_categoria
    id_subcat=1 | id_categoria=1 | nome_subcategoria=SUBCATEGORIA A-1 |
    id_subcat=2 | id_categoria=1 | nome_subcategoria=SUBCATEGORIA A-2 |
    id_subcat=3 | id_categoria=1 | nome_subcategoria=SUBCATEGORIA A-3 |
    id_subcat=4 | id_categoria=2 | nome_subcategoria=SUBCATEGORIA B-1 |
    id_subcat=5 | id_categoria=2 | nome_subcategoria=SUBCATEGORIA B-2 |
    id_subcat=6 | id_categoria=2 | nome_subcategoria=SUBCATEGORIA B-3 |
    id_subcat=7 | id_categoria=3 | nome_subcategoria=SUBCATEGORIA C-1 |
    id_subcat=8 | id_categoria=3 | nome_subcategoria=SUBCATEGORIA C-2 |
    id_subcat=9 | id_categoria=3 | nome_subcategoria=SUBCATEGORIA C-3 |
    Fino a qui mi è tutto chiaro (spero di essermi spiegato bene), ma i miei problemi e dubbi nascono quando voglio stampare a video i dati delle due tabelle. In particolare io dovrei avere una cosa del genere:

    codice:
    -CATEGORIA A
    subcategoria A-1, subcategoria A-2, subcategoria A-3. 
    
    -CATEGORIA B
    subcategoria B-1, subcategoria B-2, subcategoria B-3.
    
    -CATEGORIA C
    subcategoria C-1, subcategoria C-2, subcategoria C-3.
    Per fare ciò avevo pensato a due query annidate, cioè una prima query che estrae il nome_categoria e id_cat dalla tabella categoria e poi fare una seconda quesry, annidata nella prima, la quale estrae dalla tabella sub_categoria il campo nome_subcategoria mettendo in relazione le due tabelle mediante:

    Codice PHP:
    where id_categoria=$id_cat 
    Ho provato a fare ciò ma non funge, o meglio non mi da nulla come output VVoVe: VVoVe: VVoVe:

    Pertanto ho deciso di scrivere nel forum e di chiedere un vostro parere.

    1) secondo voi il mio modo di procedere è giusto? Esiste un modo diversi?

    2) Come posso risolvere questo problema?

  2. #2
    Allora ho fatto delle prove e ho sistemato un pò il codice e sono riuscito, a metà, nel mio intento!

    Sono riuscito a far stampare a video il contenuto delle due tabelle e mettendole in relazione...così come ho spiegato prima. L'unico problema è che lo script estrae solo il primo record della tabella CATEGORIA e quindi poi solo i records, della tabella SUB_CATEGORIA, che sono relazionati con la tabella precedente.

    Vi posto anche il codice php:

    Codice PHP:
    // estraggo il nome della categoria e ID dalla tabella CATEGORIA
    $query_categoria "SELECT  *  FROM categoria  "
    $result_cat mysql_query($query_categoria$db); 
    while (
    $row mysql_fetch_array($result_cat))
    {
    // stampo il nome della categoria
    echo"$row[nome_categoria]
    \n"
    ;
    $id_cat="$row[id_cat]";
    // estraggo il nome della subcategoria 
    // da notare che questa query è annidata nella query precedente
    $query_subcategoria "SELECT  *  FROM  subcategoria  WHERE  id_categoria='$id_cat' "
    $result_subcategoria mysql_query($query_subcategoria$db); 
    while (
    $row mysql_fetch_array($result_subcategoria)){
    // stampo il nome della subcategoria
    echo"$row[nome_subcategoria],\n";
    }

    Allora con questo codice e modo di procedere riesco a stampare solo la prima CATEGORIA e le subcategorie associate alla prima Categoria. Cioè ottengo questo:

    codice:
    -CATEGORIA A
    subcategoria A-1, subcategoria A-2, subcategoria A-3.
    Le altre categorie e subcategorie non vengono stampate!
    Perchè?

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    vedi se puoi usare group_concat

    codice:
    select categoria.nome_categoria,
    group_concat(sub_categoria.nome_subcategoria order by sub_categoria.nome_subcategoria asc separator ',') as gruppo
    from categoria 
    inner join sub_categoria
    on categoria.id_cat = sub_categoria.id_categoria
    group by sub_categoria.id_categoria

  4. #4
    Ho lo stesso problema solo che se utilizzo i cicli while annidati ottengo:
    codice:
    -CATEGORIA A
    subcategoria A-1, subcategoria A-2, subcategoria A-3 
    subcategoria A-1, subcategoria A-2, subcategoria A-3
    subcategoria A-1, subcategoria A-2, subcategoria A-3
    
    -CATEGORIA B
    subcategoria B-1, subcategoria B-2, subcategoria B-3 
    subcategoria B-1, subcategoria B-2, subcategoria B-3
    subcategoria B-1, subcategoria B-2, subcategoria B-3
    
    -CATEGORIA C
    subcategoria C-1, subcategoria C-2, subcategoria C-3 
    subcategoria C-1, subcategoria C-2, subcategoria C-3
    subcategoria C-1, subcategoria C-2, subcategoria C-3
    cioè le righe con le subcategorie con stesso id della categoria ripetute per quante categorie ci sono le database (in questo caso A B C e quindi stampa tre volte le subcategorie!)

    se invece utilizzo la query di nicola75ss ottengo:
    codice:
    -CATEGORIA A
    subcategoria A-1
    -CATEGORIA A
    subcategoria A-2
    -CATEGORIA A
    subcategoria A-3
    ....
    cioè righe per ogni subcategoria, ma questo a me non interessa.

    come faccio ad ottenere questo:
    codice:
    riga1 - CATEGORIA A subcategoria A-1 subcategoria A-2 subcategoria A-3 
    riga2 - CATEGORIA B subcategoria B-1 subcategoria B-2 subcategoria B-3 
    riga3 - CATEGORIA C subcategoria C-1 subcategoria C-2 subcategoria C-3
    Grazie in anticipo a chi mi aiuterà.

  5. #5
    HEEEEEEEEELP!!!

  6. #6
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    ho fatto circa un' oretta fa quello che tu stai cercando di fare.
    premetto che le mie relazioni non sono su ID ma sui codici, e che query() è una mia funzione ...

    detto questo il mio risultato lo pttengo a pieno

    Codice PHP:
    $end_var_testa=array();
    $end_var_righe=array();
    $var_testa_list=query("SELECT Codice,Descrizione FROM varianti_testa");
    $x=0;
    while (
    $res=mysql_fetch_array($var_testa_list,MYSQL_ASSOC))
      {
      
    //echo "  var_testa_list[$n] = \"{$res['Codice']}|{$res['Descrizione']}\";\n";
      
    $end_var_testa[$x]="{$res['Codice']}|{$res['Descrizione']}";
      
    $var_righe_list=query("SELECT Codice,Descrizione,Varianti_testa_Cod FROM varianti_righe WHERE Varianti_testa_Cod = '{$res['Codice']}' ORDER BY Ordine ASC;");
      
      
    $y=0;
      while (
    $sub_res=mysql_fetch_array($var_righe_list,MYSQL_ASSOC))
        {
        
    $end_var_righe[$x][$y]="{$sub_res['Codice']}|{$sub_res['Descrizione']}";
        
    $y++;
        }
      
    mysql_free_result($var_righe_list);
      
    $x++;
      }
      
    mysql_free_result($var_testa_list); 
    io racchiudo i due risultati in 2 array e dopo me li giostro!!! spero che questo possa essere un buono spunto per te
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  7. #7
    Codice PHP:
                 $select1 "SELECT categoria.id, categoria.nome FROM categoria";

        
    $query mysql_query($select1) or die(mysql_errno().": ".mysql_error());

        while (
    $categoria mysql_fetch_array($query)) {

        echo 
    "id = $categoria[0]\n";
        echo 
    "categoria = $categoria[1]\n";

                 
    $select2 "SELECT subcategoria.nome FROM categoria, subcategoria WHERE subcategoria.id_categoria = $categoria[0]";
        
    $query_sub mysql_query($select2) or die(mysql_errno().": ".mysql_error());
        while(
    $subcategoria mysql_fetch_array($query_sub)) {

            echo 
    "subcategoria = $subcategoria[0]\n";
            }    
        
    mysql_free_result($query_sub);
        }
    mysql_free_result($query);

    sembra che io faccia la stessa cosa...
    ma mi viane stampato subcategoria per quante categorie ci sono nel database!!!

  8. #8
    Come al solito mi ero bloccato su una cavolata...
    avevo sbagliato la seconda query... avevo aggiunto:

    SELECT subcategoria.nome FROM categoria, subcategoria



    GRAZIE MILLE dottwatson

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.