Pagina 6 di 22 primaprima ... 4 5 6 7 8 16 ... ultimoultimo
Visualizzazione dei risultati da 51 a 60 su 217
  1. #51
    la terza tabella sono le foglie, in effetti potrebbe essere superflua ma l' avevo ragionata cosi' :

    1 tabella solo INTEGER UNSIGNED , molto veloce in lettura, query al limite dello 0.0004 su piu' tests effettuati con qusta struttura ....

    2 tabella dei rami, cos'e' un ramo ? un ramo e' la descrizione sommaria di dove siamo, ma non necessariamente tutti i dati di dove siamo ... insomma e' un nome, con cognome e data di nascita, per intenderci, dove tutti quelli che hanno la stessa data, lo stesso nome e lo stesso cognome, possono raccontarci la loro storia, il loro lavoro, i loro dati in modo piu' dettagliato e meno pesante con la terza tabella ... ovvero la

    3 dove non ci sono probemi di grandezza o dimensioni , semplicemente ci sara' tutto quello che ci pare, ma il bello e' che la terza puo' essere ulteriormente slegata, ovvero possono esserci piu' terze tabelle di dettaglio , tabella costituzione, tabella lavoro, tabella nucleo familiare ( ovviamente tutte con lo stesso branch_id ) ... etc etc, insomma e' solo un gradino in piu' per slegare il tutto.



    Per esempi piu' pratici, piu' di postare uno script che da solo crea il database se non c'e' e con javascript ti fa mettere infiniti rami e cancellarne altrettanti non so che fare


    Mentre sto' comunque passando ad una classe pero' l' eliminazione non e' cosa semplice da fare ... sono a buon punto ma non sono ancora ad hoc ... oggi pomeriggio vi faro' sapere come sto' messo ...


    per ora c'e' un addNode,un delNode poco testato e un getNode che restituisce tutte le info del ramo ... utile per "esplodere" poi eventualmente tutte le foglie di quel sottoramo, sempre che sia necesario

    in ultimo, una volta capito come si muove l' lgoritmo, e' semplice da gestire, non e' cosi' complesso, all' inizio pensavo peggio





    [editato]
    comunque ripensandoci le 2 sole tabelle, tree e branch, dovrebbero bastare e incidere poco in termini di fatica o prestazioni anche se branch e' complessa o piena di dati ... pero' questo metodo che sto' testando non esclude affatto l' utilizzo della sola branch, anzil per ora le foglie non vengono nemmeno chiamate, si potrebbero anche cancellare dall' installazione automatizzata
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #52
    Utente di HTML.it L'avatar di M4rko
    Registrato dal
    Dec 2000
    Messaggi
    619
    [supersaibal]Originariamente inviato da andr3a
    Per esempi piu' pratici, piu' di postare uno script che da solo crea il database se non c'e' e con javascript ti fa mettere infiniti rami e cancellarne altrettanti non so che fare [/supersaibal]
    Ok lì è tutto chiaro, ma l'esempio lo volevo sullo spostamento di un nodo da una parte ad un'altra dell'albero Hai detto che basta modificare, nella tabella branch, solo l'id del tree, ma non mi pare che sia cosi semplice, il tree lo dovrai pur spostare (quindi aggiornare i flag sinistra e destra). Per questo dicevo che secondo me, su questo punto, non cambia niente

    Mentre sto' comunque passando ad una classe
    non avevamo dubbi...

    pero' l' eliminazione non e' cosa semplice da fare
    Non hai guardato la libreria allegata con l'articolo? L'eliminazione è macchinosa ma il concentto è sempre lo stesso: aggiornare le etichette sinistra e destra. Nel tuo caso si aggiunge soltanto un delete anche alla tabella branch (where tree_id=$id per capirci)

    [editato]
    comunque ripensandoci le 2 sole tabelle, tree e branch, dovrebbero bastare e incidere poco in termini di fatica o prestazioni anche se branch e' complessa o piena di dati ... pero' questo metodo che sto' testando non esclude affatto l' utilizzo della sola branch, anzil per ora le foglie non vengono nemmeno chiamate, si potrebbero anche cancellare dall' installazione automatizzata
    Ecco, allora siamo d'accordo
    Tutti hanno bisogno di credere in qualcosa.
    Io credo che mi farò un'altra birra.


  3. #53
    [supersaibal]Originariamente inviato da M4rko
    Non hai guardato la libreria allegata con l'articolo? L'eliminazione è macchinosa ma il concentto è sempre lo stesso: aggiornare le etichette sinistra e destra. Nel tuo caso si aggiunge soltanto un delete anche alla tabella branch (where tree_id=$id per capirci)
    [/supersaibal]
    veramente di quell' articolo ho visto solo il disegno e la creazione tabella

    comunque sto' facendo la stessa cosa ... cioe' ...

    passo l' id del branch

    cerco sx e dx del tree corrispondente

    prendo tutti gli id della tabella tree dove sx >= risultato e dx <= risultato della query precedente

    elimino tutti quegli id su tree e sul tree_id del branch ... pero' ancora c'e' qualcosa che non mi quadra

    in ultimo ci sara' il moveNode , che penso sia forse il piu' complesso ... l' ideale in generale credo sia ricreare la srtuttura utile in un array , azzerare tutti i sx e dx, ricrearli in modo pulito ... mentre io sto' facendo altre cose


    boh, faro' sapere
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #54
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    in riferimento all'articolo e a questa figura:


    è possibile avere l'elenco del solo primo livello immediatamente sotto ad un altro? per esempio sapere che sotto francesco ci sono mario luigi e fabio.



    think simple think ringo

  5. #55
    Utente di HTML.it L'avatar di M4rko
    Registrato dal
    Dec 2000
    Messaggi
    619
    [supersaibal]Originariamente inviato da marketto
    è possibile avere l'elenco del solo primo livello immediatamente sotto ad un altro? per esempio sapere che sotto francesco ci sono mario luigi e fabio.[/supersaibal]
    Partendo dal codice che ha postato andrea poco sopra (che stampa l'intero albero), con qualche modifica si riesce ad ottenere il risultato desiderato.

    Il primo passo è conoscere le etichette del nodo da cui vuoi partire
    codice:
    $sql = "SELECT id, sx, dx FROM personale WHERE nome='Francesco'";
    $res = mysql_query($sql);
    $line = mysql_fetch_assoc($res);
    naturalmente nella clausula WHERE ho usato il nome solo per comodità, si potrebbe utilizzare l'ID

    A questo punto riprendo il codice di andrea, con qualche modifica
    codice:
    $sql = "SELECT id, nome, sx, dx FROM personale WHERE sx >= {$line['sx']} AND dx <= {$line['dx']} ORDER BY sx ASC";
    $res = mysql_query($sql);
    $last_sx = $line['sx'];
    $tab = 0;
    $output = '<pre>';
    while( $r = mysql_fetch_array( $res ) ) {
        $compare = (int)$r[2];
        if( $compare === ( $last_sx + 1 ) ) {
            $tab++;
        }
        else if( $compare > ( $last_sx + 2 ) && $tab >= ( $compare - ( $last_sx + 2 ) ) ) {
            $tab -= $compare - ( $last_sx + 2 );
        }
        if ($tab < 2) {
            $output .= str_repeat( "\t", $tab );
            $output .= "{$r['id']} - {$r['nome']} ({$r['sx']}, {$r['dx']})
    ";
        }
        $last_sx = $compare;
    }
    echo $output . '</pre>';
    in grassetto le modifiche a cui è il caso di prestare attenzione (l'etichetta sx da cui si parte non sarà più "1" ma sarà quella del nodo che ti interessa, mentre il controllo sul $tab in sostanza ti dice quanti livelli dell'albero hai sceso).

    Da notare come la struttura cosi com'è non ti dice immediatamente a che livello sei, spesso ho visto anche implementazioni che inseriscono un campo "level" numerico per dire a che livello si trova un nodo, comodo per fare query come questa che ti interessa, ma molto scomodo quando devi inserire, rimuovere, spostare i nodi perchè hai un campo in piu da aggiornare oltre alle due etichette

    (ps: il codice sopra l'ho provato al volo ma magari si puo far di meglio )
    Tutti hanno bisogno di credere in qualcosa.
    Io credo che mi farò un'altra birra.


  6. #56
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    [supersaibal]Originariamente inviato da M4rko
    [/supersaibal]
    danke, funzia...


    think simple think ringo

  7. #57
    allora, ho dato un' occhiata ai tuoi sorgenti, e' evidente che stavo facendo non pochi casini quando le tue 3 query semplificavano e di molto tutto il discorso ...

    questo punto ho un getNode, addNode, delNode perfettamente funzionanti, mi manca il moveNode ... qualche consiglio ?

    il discorso e' che teoricvamente e' semplice , praticamente mi manca una scorciatoia per spostare ...

    dovrei prendere sx e dx del nodo , modificare dx del parent, aggiungere il ramo con sx uguali a sx + ( altro_sx - sx ) ed aggiornare tutti i dx > del precedente parent dx ... insomma, non ci sto' capendo niente
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #58
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    [supersaibal]Originariamente inviato da andr3a
    questo punto ho un getNode, addNode, delNode perfettamente funzionanti, mi manca il moveNode ... qualche consiglio ?
    [/supersaibal]
    qua c'è un moveNode:
    http://www.klempert.de/php/nested_se...file=NestedSet


    think simple think ringo

  9. #59
    [supersaibal]Originariamente inviato da marketto
    qua c'è un moveNode:
    http://www.klempert.de/php/nested_se...file=NestedSet


    [/supersaibal]
    non c'e' l' IF su sqlite


    ... non lo sapevo, eppure fino ad ora era andato cosi' bene



    vabbeh, ci provo domani, per chi avesse idee ... attendo volentieri ... piu' o meno l' ho pensata cosi'

    creo una tabella temp ( lavoro solo sulla tree per questa operazione, quindi e' rapidissima )
    copio il ramo da spostare
    elimino come se fosse un delete dalla tree
    a quel punto dovrei aggiungere nella tree il nuovo ramo, come se fosse un inserimento ... solo che on posso farne uno alla volta per tutto il ramo, devo trovare il modo di farlo in un solo passaggio ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #60
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    un'ulteriore modifica al codice di andr3a e m4rko:
    codice:
    $sql = "SELECT id, nome, sx, dx FROM personale WHERE sx >= {$line['sx']} AND dx <= {$line['dx']} ORDER BY sx ASC";
    $res = mysql_query($sql);
    $last_sx = $line['sx'];
    $tab = 0;
    $output = '<pre>';
    while( $r = mysql_fetch_assoc( $res ) ) {
        $compare = (int)$r['sx'];
        if( $compare === ( $last_sx + 1 ) ) {
            $tab++;
        }
        else if( $compare > ( $last_sx + 2 ) && $tab >= ( $compare - ( $last_sx + 2 ) ) ) {
            $tab -= $compare - ( $last_sx + 2 );
        }
        if ($tab < 2) {
            $output .= str_repeat( "\t", $tab );
            $output .= "{$r['id']} - {$r['nome']} ({$r['sx']}, {$r['dx']})
    ";
        }
        $last_sx = $compare;
    }
    echo $output . '</pre>';
    così è indipendente dall'ordine col quale vengono selezionati i campi...
    think simple think ringo

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.