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

    [Query MySQL] inner join:problema.

    sto interrogando un db di 2 tabelle:

    categorie e subcategorie

    con questa query estraggo tuttti i record presenti in subcategorie dove compare un nome presente in categorie e con il codice sotto li visualizzo:

    codice:
    $sql = "SELECT categorie.nomecat, subcategorie.nomesubcat FROM categorie INNER JOIN subcategorie ON categorie.nomecat = subcategorie.nomecat";
    $result = @mysql_query($sql) or die (mysql_error ());
    while ($row = @mysql_fetch_array($result))
    {
    $categoria = $row['nomecat'];
    $subcategoria = $row['nomesubcat'];
    echo $categoria."
    ";
    echo $subcategoria."
    ";
    }
    ora il problema è che in questo modo la visualizzazione è :

    CATEGORIA1
    SUBCATEGORIA1
    CATEGORIA1
    SUBCATEGORIA2
    CATEGORIA2
    SUBCATEGORIA1
    CATEGORIA2
    SUBCATEGORIA2
    ...

    e così via...

    io vorrei che la visualizzazione fosse:

    CATEGORIA1
    SUBCATEGORIA1
    SUBCATEGORIA2
    CATEGORIA2
    SUBCATEGORIA1
    SUBCATEGORIA2

    .....

    dove devo intervenire? sul codice o sulla query?

    grazie..

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    78
    Ciao,

    se mi ricordo bene dalle lezioni di databases basta aggiungere il keyword GROUP.
    Magari in Mysql non esiste neanche, ma se esiste guarda come si usa e il tuo problema dovrebbe essere risolto...

  3. #3
    il problema è che, raggruppandoli per nomecategoria ad esempio, mi da solo UN record della tabella subcategorie..

    io vorrei che dopo il nome della categoria mi beccasse tutti i record associati nell'altra tabella...

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    78
    Scusa non ho capito bene cosa vuoi ottenere, ma se cambi il codice di visualizzazione come ti ho riportato sotto dovrebbe funzionare. In questo modo scrivi la categoria solo se non l'hai già scritta....


    Codice PHP:
    $first=true;
    while (
    $row = @mysql_fetch_array($result))
    {
    $categoria $row['nomecat'];
    if (
    $old_categoria!=$categoria||$first){
          
    $subcategoria $row['nomesubcat'];
          
    $old_categoria=$categoria;
          echo 
    $categoria."
    "
    ;
          
    $first=false;
    }
    echo 
    $subcategoria."
    "
    ;

    Non è una soluzione molto elegante ma nn mi è venuto in mente di meglio (la variabile $first è x fare in modo che la prima categoria venga visualizzata.... spero di non aver cannato la sintassi dell'or nell'if)

  5. #5
    Originariamente inviato da Mich24
    Scusa non ho capito bene cosa vuoi ottenere, ma se cambi il codice di visualizzazione come ti ho riportato sotto dovrebbe funzionare. In questo modo scrivi la categoria solo se non l'hai già scritta....


    Codice PHP:
    $first=true;
    while (
    $row = @mysql_fetch_array($result))
    {
    $categoria $row['nomecat'];
    if (
    $old_categoria!=$categoria||$first){
          
    $subcategoria $row['nomesubcat'];
          
    $old_categoria=$categoria;
          echo 
    $categoria."
    "
    ;
          
    $first=false;
    }
    echo 
    $subcategoria."
    "
    ;

    Non è una soluzione molto elegante ma nn mi è venuto in mente di meglio (la variabile $first è x fare in modo che la prima categoria venga visualizzata.... spero di non aver cannato la sintassi dell'or nell'if)
    mi stavo a scervellare nel fare la query e non avevo pensato a sto modo semplice (altro che poco elegante: semplice e comodo!) per farlo..

    grazie..

    EDIT:

    l'unico inconveniente è che mi visualizza solo la prima subcategoria ripetendola per il numero di volte giuste, ma nn passa al record successivo...

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    78
    Uhm ok, prova a mettere $subcategoria = $row['nomesubcat']; fuori dall'if, in questa maniera:

    Codice PHP:
    $first=true;
    while (
    $row = @mysql_fetch_array($result))
    {
    $categoria $row['nomecat'];
    if (
    $old_categoria!=$categoria||$first){
          
    $old_categoria=$categoria;
          echo 
    $categoria."
    "
    ;
          
    $first=false;
    }
    $subcategoria $row['nomesubcat'];
    echo 
    $subcategoria."
    "
    ;

    se non funziona non ho capito il problema (nel caso prova a riportare l'output e dirmi come invece dovrebbe essere....)

  7. #7
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da andropoff
    mi stavo a scervellare nel fare la query
    Facevi male, perché attraverso la query non c'è modo di riuscirci. Una query restituisce sempre una tabella, mentre a te serviva una struttura gerarchica.
    L'unico modo è estrarla dal risultato scorrendola attraverso il codice

  8. #8
    Originariamente inviato da Mich24
    Uhm ok, prova a mettere $subcategoria = $row['nomesubcat']; fuori dall'if, in questa maniera:

    Codice PHP:
    $first=true;
    while (
    $row = @mysql_fetch_array($result))
    {
    $categoria $row['nomecat'];
    if (
    $old_categoria!=$categoria||$first){
          
    $old_categoria=$categoria;
          echo 
    $categoria."
    "
    ;
          
    $first=false;
    }
    $subcategoria $row['nomesubcat'];
    echo 
    $subcategoria."
    "
    ;

    se non funziona non ho capito il problema (nel caso prova a riportare l'output e dirmi come invece dovrebbe essere....)
    infatti adesso funziona!!!!

    porta pazienza ma sto imparando...

    una curiosità:

    if ($old_categoria!=$categoria||$first)

    mi spighi che significa?!

    $old_categoria recupera per caso l'ultimo valore che ha avuto categoria?! :master:

    e "||" che operatore è?!

    LUCA200: infatti lo scervellamento in realtà era nel capire se era attraverso la query che potevo raggiungere questo risultato...

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    78
    if ($old_categoria!=$categoria||$first)
    Allora prima di tutto || vuol dire 'or', 'oppure'. Per far sì che la condizione dell'if sia vera UNA DELLE DUE opzione deve essere vera. Quindi vale ($old_categoria!=$categoria) oppure ($first=true).

    se $old_categoria!=$categoria restituisce falso significa che la categoria che stiamo trattando è diversa dalla categoria che abbiamo già trattato in precendenza ($old_categoria). Quando questo avviene entriamo quindi nell'if. Qui salviamo il valore della categoria che stiamo trattando in $old_categoria. Quindi siamo noi a salvare il valore dell'ultima categoria trattata in $old_categoria (questa variabile avrebbe potuto chiamarsi in qualsiasi altro modo!)

    la variabile $first serve solamante per fare eseguire il codice nell'if anche la prima volta che viene eseguito il loop (e cioè quando $old_categoria non è ancora stato settato).

    Non so se mi sono spiegato bene, in realtà è più semplice di quel che sembra

  10. #10
    Originariamente inviato da Mich24
    Allora prima di tutto || vuol dire 'or', 'oppure'. Per far sì che la condizione dell'if sia vera UNA DELLE DUE opzione deve essere vera. Quindi vale ($old_categoria!=$categoria) oppure ($first=true).

    se $old_categoria!=$categoria restituisce falso significa che la categoria che stiamo trattando è diversa dalla categoria che abbiamo già trattato in precendenza ($old_categoria). Quando questo avviene entriamo quindi nell'if. Qui salviamo il valore della categoria che stiamo trattando in $old_categoria. Quindi siamo noi a salvare il valore dell'ultima categoria trattata in $old_categoria (questa variabile avrebbe potuto chiamarsi in qualsiasi altro modo!)

    la variabile $first serve solamante per fare eseguire il codice nell'if anche la prima volta che viene eseguito il loop (e cioè quando $old_categoria non è ancora stato settato).

    Non so se mi sono spiegato bene, in realtà è più semplice di quel che sembra
    ti sei spiegato DA DIO ... grazie 1000...

    stai aiutando un povero sviluppatore ad uscire dal limbo di ASP per passare a qualcosa di più evoluto... stai facendo un opera per la collettività dell'web ....

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.