Avatar billede Mik2000 Professor
27. januar 2010 - 22:25 Der er 10 kommentarer og
1 løsning

Sti / breadcrump ud fra database - hvordan?

Hej

Jeg har en tabel der ser sådan her ud:

id
kategoriniveau
kategorinavn
kategoribeskrivelse

Den fungere således at hvis niveau er 0, så er det en top kategori. Hvis kategoriniveau er et tal, så svarer den til et ide på en eksisterende kategori, og er dermed underkategori til denne osv osv osv osv osv osv

Eksempe på testdata
id, niveau, navn, beskrivelse
1, 0, "Topkategori 1", "Topkategori 1 beskrivelse"
2, 0, "Topkategori 2", "Topkategori 2 beskrivelse"
3, 0, "Topkategori 3", "Topkategori 3 beskrivelse"
4, 1, "Underkat til topkat 1", "Underkategori til topkategori 1"
5, 2, "Underkat til topkat 2", "Underkategori til topkategori 2"
6, 3, "Underkat til topkat 3", "Underkategori til topkategori 3"
7, 6, "Underunderkat til underkat med id 6", "Underunderkat til underkat med id 6"

Det jeg så gerne vil lave er en slags sti/breadcrump, så den viser hvilken kategori man er i. Er man f.eks. i den sidste i ovennævnte eksempeldata, skal den skrive:
Topkategori 3 => Underkat til topkat 3 => Underunderkat til underkat med id 6

Hvordan laver man noget sql der er i stand til at gå tilbage i niveauer så man kan udskrive ovenstående?

Spørg endelig hvis du ikke forstår det
28. januar 2010 - 06:23 #1
Det er til at finde ud af, men "sporene skraemmer" - du har ladet en lang raekke tidligere spoergsmaal blive staaende aabent, ja stoerstedelen af spoergsmaal oprettet det sidste aar, saa jeg skoenner at hvis jeg nu gaar i gang med dette spoergsmaal saa risikerer jeg ogsaa at blive haengende i et evigheds-aabent spoergsmaal.  Luk dine gamle spoergsmaal (hvis du til et spoergsmaal ikke fik et brugbart svar saa opret selv et svar og accepter det) saa kan vi snakke sammen.
Avatar billede Mik2000 Professor
28. januar 2010 - 11:36 #2
Ja der var da efterhånden kommet en del jeg ikke har fået afsluttet ;).
Nu er flere lukket og dem der ikke er lukket har jeg bedt folk skrive svar da der kun er skrevet kommentarer og derfor ikke kan gives point :)
28. januar 2010 - 12:03 #3
Ja, og nu er du dagens topscorer paa grund af alle de udestaaende points du har faaet tilbage.  Jeg skal kikke paa spoergsmaalet naar jeg kommer fra arbejde.
28. januar 2010 - 21:13 #4
Jeg har ikke glemt dig.  Men for det foerste kom jeg senere hjem end jeg havde regnet med, for det andet var der noget andet jeg skulle, for det tredje .. er det nok lidt mere kompleks end jeg foerst troede.

Men under alleomstaendigheder vil en loesning indebaere en forbedret tabel struktur.  Du beskriver nu niveauer med tekst saasom "Underunderkat til underkat med id 6".  Det vil slet ikke vaere holdbart naar antallet af kategorier og antallet af niveauer stiger, og det vil vaere meget vanskeligt at soege i.  I stedet kan du simpelthen for hver kategori give id nummeret paa dens forgaenger.  Niveauet af en kategori er saa lig med antallet af forgaengere.  Kategorier med 0 forgaengere er paa niveau 0, topniveau.  Her er mit forslag til tabellen sammen med lidt data.  Jeg har med vilje blandet niveauerne lidt.

Tabel Niveau
ID Forgaenger Navn
1  NULL      'kategori A'
2  1          'kategori B'
3  NULL      'kategori C'
4  7          'kategori D'
5  10        'kategori E'
6  10        'kategori F'
7  NULL      'kategori G'
8  10        'kategori H'
9  7          'kategori I'
10 1          'kategori J'

Saa der er tre kategorier paa top niveau, kategori A, C, og G.  A har to subkategorier B og J, og J har tre subkategorier E, F, og H, o.s.v.  Kategori E vil du saa have skrevet ud som 'kategori A' => 'kategori J' => 'kategori E'

Det er saa langt som jeg kommer i aften.  Jeg soeger nu efter en SQL ekspression der for en given kategori recursivt soeger efter dens forgaenger og dennes forgaenger, o.s.v. indtil der ikke er flere forgaengere.  I morgen.
30. januar 2010 - 07:29 #5
mic2000, det tog meget for laenge.  Men nu har jeg noget.

Du spurgte paa "noget sql" der for en kategori kan udskrive stien fra top kategorien.  Det var min ambition at goere det i et hug i sql, men jeg fandt ingen mulighed uden ved hjaelp af sql procedures og det kan jeg ikke teste fordi min mysql har begraenset support for procedures. 

Men jeg kan lave det som en kombination mellem php og sql.  Hvis du vaelger et niveau (for eksempel ved hjaelp af et input felt) saa laver php en sql query til det naeste hoejere niveau og en ny sql query til dets hoejere niveau o.s.v. indtil du er paa et topniveau.  Derefter udskriver den stien.

Jeg gaar ud fra en tabel med tre felter hvor hver kategori har en id, et navn, og id'en for dens forgaenger.  For en kategori paa topniveau staar der 0 som forgaenger id.

For test lavede jeg denne side http://christianjorgensen.be/mik2000.php som du er velkommen til at besoege, sammen med en mysql tabel som jeg viser nedenfor.  I tabellen hedder, for eksempel, kategorien med id 8 'kategori H' og er paa sub-sub niveau med 'kategori J' som dens sub niveau forgaenger og 'kategori A'. Jeg starter min php code med $id=8 (hvor du ville vaelge $id ved hjaelp af en formular eller lignende) og jeg faar foelgende resultat:

kategori A => kategori J => kategori H

Jeg haaber at det svarer til hvad du er ude efter.  Hvis jeg har misforstaaet dig saa forklar.

Her er min kode og min tabel:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title></title>
<?
function search($id)
{
  $result=mysql_query("SELECT forgaenger, navn FROM mik2000 WHERE id=$id");
  $row=mysql_fetch_array($result);
  return $row;
}
?>
</head>
<body>
<?
$link = mysql_connect ('xxxx', 'yyyy', 'zzzz') or die(mysql_erorr());
mysql_select_db('christianjoygen') or die('Could not select database'); 
$id = 8;
$sti = "";
$count = 0;
do
{
  $row = search($id);
  $id = $row['forgaenger'];
  if($count>0)
  {
    $s = " => " . $sti;
    $sti = $s;
  }
  $s = $row['navn'] . $sti;
  $sti = $s;
  $count++;
}
while($id != 0);
echo $sti . "<br/>";
mysql_close($link);
?>
</body>
</html>

id  forgaenger  navn 
      1 0 kategori A
      2 1 kategori B
      3 0 kategori C
      4 7 kategori D
      5 10 kategori E
      6 10 kategori F
      7 0 kategori G
      8 10 kategori H
      9 7 kategori I
      10 1 kategori J
01. februar 2010 - 06:07 #6
mik2000, saa du mit indlaeg #5?  Var det et nyttigt svar paa dit spoergsmaal?  Eller har jeg misforstaaet dig, i saafald hvordan?  Giv mig din feed-back.
Avatar billede Mik2000 Professor
01. februar 2010 - 08:40 #7
Hej

Ja tak for det - har bare ikke nået at prøve det endnu, men skal nok lige vende tilbage :)
04. februar 2010 - 07:47 #8
mik2000, naar jeg selv opretter spoergsmaal her paa Eksperten saa foeler jeg at jeg har en vis forpligtelse overfor de der frivillige og ud af interesse for spoergsmaalet og for 'faget' har leveret indlaeg.  Udover den tid og energi de har investeret har de ogsaa investeret deres interesse, og jeg gaar ud fra at de gerne vil se hvad der skete med deres 'produkt.' Som minimum soerger jeg derfor for hurtig opfoelgning.  Det laengste jeg selv har haft et spoergsmaal aabent var 8 dage fordi det drejede sig om en serie komplekse malware scans paa en komputer jeg ikke kunne komme til ret tit.

De der arbejder ved betalte helpdesks skylder jeg ikke noget (andet end normal menneskelig respekt.)  Der kan jeg afbryde forbindelsen hvis jeg for eksempel pludselig ikke har tid mere.  Det er som sagt noget andet noget med mine med-medlemmer af forumet.

Maaske er det naivt af mig forvente at andre skal have samme indstilling.  Ikke desto mindre er jeg skuffet over nu at blive haengende paa dette spoergsmaal.  Jeg kendte ikke umiddelbart loesningen til dit spoergsmaal, jeg maatte analysere mig frem til det, jeg var glad for at jeg fandt ud af noget, og nu er jeg spaendt paa om det virker. 

Skulle det af den ene eller anden grund ikke laengere vaere aktuelt saa luk som minimum spoergsmaalet.  Please.
Avatar billede Mik2000 Professor
04. februar 2010 - 21:18 #9
Hej
Rolig nu :)
Jeg har ikke glemt dig og er meget glad for dit svar - har bare ikke nået at prøve det endnu, fordi der har været meget travlt med arbejde og uddannelse :)
Men skal nok vende tilbage, så snart jeg har mulighed for det :)
Avatar billede Mik2000 Professor
04. februar 2010 - 21:34 #10
Skal nok se om jeg ikke kan nå det når jeg kommer hjem om ca 30 min :)
Avatar billede Mik2000 Professor
05. februar 2010 - 16:23 #11
Endte med at måtte arbejde over men kom tidligt hjem i dag og fik prøvet det :)
Det virker lige som det skal.
Mange tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester