Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: Query pazzesca...

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    142

    Query pazzesca...

    Salve a tutti,
    spero che qualcuno possa essermi d'aiuto.
    Ho una tabella di questo tipo (un albero sostanzialmente)

    | id | nome | nodopadre|
    1 Europa 0
    2 Italia 1
    3 Francia 1
    4 Spagna 1
    5 Lazio 2
    6 Emilia 2
    7 Roma 5
    8 Rieti 5
    9 Colosseo 7

    avrei bisogno (se si puo fare) di una query per cui selezionato ad esempio una nazione (es italia id=2) mi restituisca tutti i record "figli" cioe: Italia, Lazio, Roma, Rieti, Colosseo

    Si puo fare con una query oppure è necessario per forza e necessariamente utlizzare delle funzioni php ricorsive?

    Grazie

  2. #2
    Fai due tabelle, in una metti il nome del paese nell'altra il nome della regione.

    Esempio
    ID|NOME PAESE|

    ID|NOME REGIONE|ID PAESE

    Poi fai una JOIN tra le due tabelle... e vissero felici e contenti!

    PS:
    Ovvio che ID PAESE deve essere uguale a ID dell'altra tabella. Così come è ovvio che se ti viene più semplice puoi fare la join per nome piuttosto che per id...

  3. #3
    Originariamente inviato da pezzo
    Fai due tabelle, in una metti il nome del paese nell'altra il nome della regione.

    Esempio
    ID|NOME PAESE|

    ID|NOME REGIONE|ID PAESE

    Poi fai una JOIN tra le due tabelle... e vissero felici e contenti!

    PS:
    Ovvio che ID PAESE deve essere uguale a ID dell'altra tabella. Così come è ovvio che se ti viene più semplice puoi fare la join per nome piuttosto che per id...
    da quello che vedo, non è solo su due livelli...i livelli sono N
    ·.·´¯`·)»Davide«(·´¯`·.·
    edivad82:~#/etc/init.d/brain restart
    Brain is a Network

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    142
    ehm...il problema è molto piu complesso e forse non sono stato molto chiaro. Il tipo di profondita della tabella è molto vasto. SI potrebbe partire ad esempio da Continente, Nazione, Regione, Provincia, Comune, Frazione. A questo punto avrei bisogno di elencare a partire ad esempio dalla regione Lombardia tutte le province, i comuni, le frazioni della Lombardia ovvero tutti quei nodi che a ritroso arrivano fino al "nodopadre" con id uguale a quello della Lombardia...Quindi i record che devo elencare non aprtono necessariaemnte dal nome del Paese (italia) ma anche da una regione o da un continente o da un Comune...
    Spero di essere stato piu chiaro.... :master:

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    142
    i livelli sono N appunto...e la ricerca puo avvenire dal primo all'ennesimo livello indistitnamente....

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    229

    Re

    Ciao se non ho capito male, puoi risolvere il problema facendo una doppia vista della tabella e mettendo in join il tuoi id nazione con il came_from_id (cioè da dove proviene, è il numero che hai scritto a destra).
    qui sotto la query che ho scritto è con la sintassi oracle ma non dovresti aver problemi in php.
    nella queri id è il numero che hai messo a sinistra e came_from_id quello che hai messo a destra
    Codice PHP:
    select figli.nazione,figli.id 
    from nazioni nazione
    ,
         
    nazioni  figli 
    where nazione
    .nazione='Italia'
    and nazione.id=figli.came_from_id
    Così scendi di un solo livello.Se hai bisogno di farla ricorsiva fammelo sapere che ci penso un attimo.
    Spero di esserti stato utile.....
    Ciao.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    142
    ciao,
    grazie per la risposta. Mi sembra di capire che con quella select scendo solo di un livello però io avrei bisogno di tutti i record "sotto" l'id del record "padre". Nel caso in esame se scelgo l'id dell'italia mi dovrebbero uscire fuori tutti i record relativi alle regioni, comuni, province ecc....

    Il tutto si puo fare con delle funzione php ma mi chiedevo se era possibile farlo con una query....

    grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    229

    RE

    Scusa ho riletto bene quello che hai detto.Vuoi la soluzione ricorsiva....
    Bè puoi usare la stessa query.Metti un ciclo while e la ripeti finchè la query no vai in not_found. A ogni ciclo al posto di nazione o id della nazione (che è meglio perchè più rapida) inserisci quella del figlio (cioè il risultante della select colonna "figli.id").I while dovrebbero essere più di uno perchè devi scorrere ogni ramo finchè la query torna qualcosa.
    Se ho un attimo di tempo provo a darti qualcosa di più concreto.
    Ciao.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    142
    Ok....grazie per la pazienza...
    Ma i cicli while li riferisci al php? Se è cosi non preoccuparti del codice poichè l'ho gia realizzato, volevo solo sapere se con una query (anche complessa) era possibile utilizzare la ricorsivita con mysql ed estrarre i record che mi interessavano....
    ciao

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    229

    Re

    Se io fossi in te la risolverei con un unica "funzione ricorsiva" che ha all'interno un unica query.Credo che in php non ci siano problemi a creare funzioni che chiamino se stesse.
    In fondo il tuo è un albero e devi scorrerne i rami.Te lo scrivo in "meta linguaggio" perchè sicuramente tu sei più bravo di me con il php.Caso mai cerca anche su internet algoritmi per lo scorrimento di alberi.
    la farei così:
    Codice PHP:
    function caricaNodo(id_figlio)
    {
         
    query_estrazione_nodo(id_figlio); /*query di estrazione*/
         
    while(fecth_array_assoc() != not_found)  /* ciclo per tutti i figli estratti dalla query*/
         
    {
            
    scrivo_nodo();    /*stampo o salvo in un array il figlio estratto*/
            
    caricaNodo(id_figlio_prelevato_dalla_fetch);  /* chiamo ricorsivamente la funzione e gli passo l'id_figlio estratto dalla fetch*/

         
    }

    Così a prescindere dal livello di ricerca stampi ad ogni giro un figlio che scende di livello finchè la query torna qualcosa.
    prova a vedere se il ragionamento ti torna e provalo a scrivere in php.
    occhio alla funzione ricorsive che altrimenti vai in "loop".
    testa bene le condizioni di uscita e magari aggiungici qualche controllo.
    Spero di esserti stato utili e spero che il "metalinguaggio" sia stato comprensibile

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.