Gå til innhold

Anbefalte innlegg

Hei, har per i dag ein kode som finner stien tilbake til root i ei under side. Koden ser slik ut:

 

do

{

Hent infromasjon om sida som ligg over.

if ( Denne sida er ei root side )

loop = false;

} while (loop);

 

La oss si at eg har desse sidene:

 

Produkter

--- Eit produkt

------ Info

------ Download

 

og eg går inn på sida Download så krever dette ein spørring for å finne info om sida 'Downloads' og så to looper som finner 'Eit produkt' og 'Produkter'. Det eg lurer på er om det går ann å loope i sql og gjere dette i ein spørring. Det eg tenker meg er at spørringen ser om `parent` er 0. Vist ikkje så finn den sida som har `id` = `parent`og så ser om denne sida har `parent` = 0, osv.

 

Håper på at det finst ein løsning på dette, men eg må si eg tviler på at det finst nokon måte å løyse dette på i sql :/

Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+142

Jeg vet ikke hvordan sql vil bli, men kan LOOP være noe?

Ellers kan jo WHILE passe bedre sammen med noen variabler? While klinger best i ørene hos meg iaf...

Endret av Slettet+142
Lenke til kommentar

Er det ikke lettere å hente ut disse dataene i en array ? Da kan du loope igjennom arrayen. Da reduserer du også belastningen på basen.

 

Jeg gjorde noe tilsvarende når jeg lagde en trestruktur for en tid tilbake. Da cachet jeg dataene i en array og brukte looper og rekursive funksjoner for å bla. finne "stien" tilbake til root.

Lenke til kommentar
Gjest Slettet+142

Hmm ok.

Hvordan var strukturen da?

 

Kjørte du en sql som f.eks "SELECT id,parent_id FROM include_sti;", loopet resultatet og kjørte id inn som key i en array, og parent_id som value["parent"] og tekst som value["tekst"]?

 

 

<?php
$q = mysql_query("SELECT id, parent_id, tekst FROM include_sti");
$stier = array();
while($r = mysql_fetch_assoc($q)){
$stier[ $r["id"] ]["parent"] = $r["parent_id"];
$stier[ $r["id"] ]["tekst"] = $r["tekst"];
}
$kjor = true;
$c_id = 0;
$sti = array();
while( $kjor ){
$id = $stier[$_GET["page_id"]]["parent"];
if($id>0) $c_id = $id;
 else $kjor = false;
$sti[] = $stier[$_GET["page_id"]]["tekst"];
}

echo 'Sti: ';
for($i=0;$i < count($sti);$i++){
if($i > 0) echo ' -> ';
echo $sti[$i];
}
?>

 

Lenke til kommentar

Det eg gjør no er å samle dataen i ein array og så cacher det. Men ettersom at eg skal bruke dette i eit prosjekt der målet er å lære nye ting så hadde eg lyst til å finne ut om dette var moglig å hente all dataen i ein spørring.

 

Er det noen som kan bruken av while eller loop og kan komme med eit enkelt eksempel? Det som står på mysql.com var veldig lite informativt

Lenke til kommentar

Mariyo:

Mener det var noe i denne gaten:

<%

Dim branchID, branchTITLE, branchPARENT, arrTotal,Content

branchTITLE =  Array("root", "node 1", "node 2", "node 3", "node 4")
branchID = Array(1, 2, 3, 4, 5)
branchPARENT = Array(0, 1, 2, 1, 4)
arrTotal = ubound(branchTITLE)



Sub ListTree(x)
 response.write "<ul><li>" & branchTITLE(x) & vbcrlf

 For i = 0 to arrTotal
 	If branchPARENT(i) = branchID(x) then
   ListTree(i)
 	End if
 Next

   response.write  "</li></ul>" & vbcrlf

End Sub

ListTree(0)

%>

 

Runar0:

 

Henter du ikke ut all dataen du trenger da med f.eks "SELECT treeId, parentId, name FROM tree" ?

 

Jeg skjønner ikke helt vitsen med å kjøre en loop i SQL'en. Hva er det du vil at spørringen din skal returnere?

Lenke til kommentar

Det eg ville oppnå var å 'hoppe' opp i stien og hente informasjon om kva av sidene på veien, men etter ein del lesing så har eg komt fram til at måten eg gjer det på no er best; loop i php og flere sql spørringer. Resultatet blir så cachet.

Lenke til kommentar
Det eg ville oppnå var å 'hoppe' opp i stien og hente informasjon om kva av sidene på veien, men etter ein del lesing så har eg komt fram til at måten eg gjer det på no er best; loop i php og flere sql spørringer. Resultatet blir så cachet.

9167242[/snapback]

Ha meg unnskyldt hvis jeg virker alt for krass, men hvis du har et minimal trestruktur og/eller totalt ignorerer nettverkstrafikk så har du rett i at det er en akseptabel løsning, og kanskje den enkleste for en programvareutvikler.

 

Joe Celko har skrevet en god bok om trær og hierarkier som er vel verdt å lese, om nettopp slike problemstillinger. I databaseløsninger med noe last/mange brukere er løsningen som du skisserer noe som aktivt vil bidra til reduksjon av ytelsen. Jeg vil klart påstå at det beste er å gjøre dette i SQL, og da mer spesifikt i en lagret prosedyre. Å kjøre loopen på klientsiden er generelt en dårlig ide.

 

De fleste seriøse databasemotorer har nå støtte for traversering av trær, i DB2 og MSSQL heter dette common table expression (også kjent som CTE og WITH clause), i Oracle heter det START WITH/CONNECT BY. Personlig foretrekker jeg CTE, som også er med i SQL:1999 og senere.

Endret av roac
Lenke til kommentar
Jeg vil klart påstå at det beste er å gjøre dette i SQL, og da mer spesifikt i en lagret prosedyre. Å kjøre loopen på klientsiden er generelt en dårlig ide.

 

Så du mener at det er positivt for ytelsen at ved hvert treff, så kjøres det en rekursiv spørring mot basen? Man looper jo seg ikke igjennom trestrukturen på klientsiden. Det gjøres på serveren (PHP) basert på cachet data fra basen.

Lenke til kommentar
Jeg vil klart påstå at det beste er å gjøre dette i SQL, og da mer spesifikt i en lagret prosedyre. Å kjøre loopen på klientsiden er generelt en dårlig ide.

 

Så du mener at det er positivt for ytelsen at ved hvert treff, så kjøres det en rekursiv spørring mot basen? Man looper jo seg ikke igjennom trestrukturen på klientsiden. Det gjøres på serveren (PHP) basert på cachet data fra basen.

9168726[/snapback]

Hvis dataene er normaliserte etter 3NF, vil du normalt (1) ikke kunne hente dem ut i én spørring og traversere dem etterpå på klientsiden. Hvis dataene IKKE er normaliserte så stiller det hele seg helt annerledes, men da ser jeg ikke problemet, og heller ingen grunn til at det overhodet ble stilt spørsmål rundt problemstillingen her.

 

Merk også, at når jeg skriver om klientsiden så er det fra databasen sitt synspunkt. Dette er et databaseforum, og klientsiden blir følgelig databasens klient, i dette tilfellet dine PHP-skript. Disse må ta kontakt med en databaseserver, og snakke over en eller annen protokoll. Denne nettverkstrafikken mener jeg bestemt at ikke er nødvendig her, og at man ved traversering av en normalisert struktur helt klart bør gjøre dette i databasen, og ikke fra klienten. Jeg har sett så alt for mange prosjekter hvor man tenker at nettverkstrafikk ikke er et problem, for så en dag å oppdage at det ble langt mer aktivitet enn man hadde regnet med, og så ble det et problem likevel.

 

Men som sagt, er ikke dataene dine normaliserte etter 3NF, og du har f eks rot-noden i for treet i hver node i treet, da kan du såklart hente ut treet i en enkelt spørring og traversere den på klientsiden i etterkant, og det vil sågar være mest effektivt.

 

(1) Det finnes måter å omgå dette på, f eks som i artikkelen som det nylig er referert til, og som i stor grad baserer seg på Joe Celkos bøker. Vær klar over at alle metoder har sine styrker og svakheter, og metoden for å kunne hente ut alle records tilhørende et tre (eller en gren) i én spørring fungerer godt for relativt statiske data, men lager mye overhead ved dynamiske strukturer.

Endret av roac
Lenke til kommentar
Gjest Slettet+142
Etter å ha lest innlegget til roac så hadde eg litt meir info til å kunne søke på google. Kom over ein veldig god artikkel  som løser alle problema mine :)

9169715[/snapback]

Genial artikkel :D

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...