Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125

    MySql - Query ricorsiva per elementi figlio

    Ciao a tutti.

    Ho una tabella con struttura ad albero.
    Codice PHP:


    Id     ownerEl      slave      name
    1        0                0          A
    2        1                1          B
    3        1                0          C
    4        3                1          D
    5        3                1          E

       Root 
         
    |
         |
      
    __ A_____
     
    |              |
     |              |
     *
    B          _ #C__
                  
    |        |
                  |        |
                *
    D      *
    Spero che sia chiaro lo schema.

    Il campo slave messo a 0 vuol dire che e' nodo
    Il campo slave messo a 1 vuol dire che e' figlio



    A ha sotto di se un ramo figlio B (ho messo l'asterisco) e un ramo nodo C(ho usato il #)

    A sua volta il nodo C ha due figli D e E

    La mia query dovrebbe funzionare cosi :

    se passo il valore di A (select.... where id=1) deve restituire B - D - E

    se passo il valore di C deve restituire solo D e E



    Se volessimo riassumere a parole...vorrei una query che mi restituisca tutti i rami di valore FIGLIO (slave a 1) chiaramente parenti(di qualsiasi livello) del nodo che seleziono .




    Aiuto ...sto impazzendo

  2. #2
    Hai provato con una stored function o procedure?
    ...::: DESIDERARE E' UMANO :::...
    ...::: POSSEDERE E' DIVINO :::...
    ...::: HAVE A NICE DAY :::...
    (¯`·.¸¸.->ĐĮ ĦΞŁŁ<-.¸¸.·`¯)
    http://www.djhellclub.com

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    sono abb indietro con quelle ...

    potresti farmi vedere con riferimento al mio esempio?

  4. #4
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da stiffa
    sono abb indietro con quelle ...

    potresti farmi vedere con riferimento al mio esempio?
    Devi costruire uno script / procedura / funzione che partendo da un nodo (nel tuo caso A)
    ti selezioni le foglie dirette di A e se ci sono nodi (non foglia) immagazzini anche in una tabella temporanea questi nodi e su questi reiteri la query sino ad arrivare a tutti i nodi foglia.

    Con una sola query non si può fare.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    Non si puo fare?

    Allora non capisco quest'articolo ....

    ho trovato hierarchical data


    Finding all the Leaf Nodes

    We can find all the leaf nodes in our tree (those with no children) by using a LEFT JOIN query:

    SELECT t1.name FROM
    category AS t1 LEFT JOIN category as t2
    ON t1.category_id = t2.parent
    WHERE t2.category_id IS NULL;

    +--------------+
    | name |
    +--------------+
    | TUBE |
    | LCD |
    | PLASMA |
    | FLASH |
    | CD PLAYERS |
    | 2 WAY RADIOS |


    Con la loro tabella funziona.....
    Ho provato ad adattarlo alla mia....ma non funziona.....

    Codice PHP:
    SELECT t1.namet1.descrizione,t1.prezzo FROM
    tree_elements 
    AS t1 LEFT JOIN tree_elements as t2
    ON t1
    .Id t2.ownerEl
    WHERE t2
    .Id =mio id di partenza

  6. #6
    occhio che quella query ti estrae solo un livello, ovvero i figli dell'elemento di cui passi l'id.
    Non tutti i sottolivelli ricorsivamente...
    ...::: DESIDERARE E' UMANO :::...
    ...::: POSSEDERE E' DIVINO :::...
    ...::: HAVE A NICE DAY :::...
    (¯`·.¸¸.->ĐĮ ĦΞŁŁ<-.¸¸.·`¯)
    http://www.djhellclub.com

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    capsisco.

    Guardando bene pero ', lo schema fa vedere che "FLASH" e' di secondo livello...e viene restituito.... mentre MP3 PLAYERS , pur essendo figlio di PORTABLE ELECTRONICS non viene restituito....



    Allora.... per farla con php non ho problemi....

    Pensavo si potesse fare anche con una sola query mysql.

    Il mio problema e' che sto usando jqSuitePHP , delle libreriche che permettono
    l'impaginazione in un jqGrid ...

    Se andate su questo link
    jqGrid
    e guardate gli esempi, noterete che per estrarre i dati si usa l'istruzione

    Codice PHP:
    // Create the jqGrid instance
    $grid = new jqGridRender($conn);
    // Write the SQL Query
    $grid->SelectCommand 'SELECT * FROM tabella'
    Siccome il codice delle classi e' criptato, non posso metter mano al metodo SelectCommand.... pensavo potessi passargli gia l'istruzione che mi restituisse
    i rami foglia ....

    Come posso risolvere?

  8. #8
    Originariamente inviato da stiffa

    Come posso risolvere?
    Ciao una soluzione - un po' rozza ma funzionale - che mi viene in mente è aggiungere un campo CHAR alla tua tabella dove dai un id univoco che tiene traccia dei parent.

    Praticamente per ogni ramo figlio concateni al treepath del parent '0' per il primo ramo figlio, '1' per il secondo ramo figlio, ecc. quando arrivi a 9 parti con le lettere 'a', 'b', ecc


    nel tuo esempio:
    Codice PHP:
    Id     ownerEl         slave       name     treepath
    1        0                0          A        1
    2        1                1          B        10
    3        1                0          C        11
    4        3                1          D        111
    5        3                1          E        112

         Root 
           
    |
           |
        
    __ A_____
       
    |             |
       |             |
       *
    B        _ #C__
                
    |      |
                |      |
              *
    D    *
    Così quando hai bisogno dei nodi foglia di C ti basta fare:
    codice:
    SELECT name, descrizione, prezzo FROM
    tree_elements   WHERE treepath like '11%'
    AND slave=1;

    Inoltre... ti consiglio di cambiare nome alla colonna slave perchè 'slave' è una keyword di mysql e non è mai saggio usare delle keyword come nome per un campo....
    potresti chiamarla -come si usa - leaf (foglia) perché se hai un albero i nodi che sotto di sé non hanno nulla non sono rami bensì foglie!

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.