Avatar billede cautoo Nybegynder
23. juli 2005 - 21:33 Der er 11 kommentarer og
1 løsning

SQL betingelse - Sub kategorier

Jeg overvejer at lave en kategoriopbygning ud fra følgende MySQL opsætning (tabel)

Kategoriid    Stamid    Tekst

Stamid = -1 betyder at det er grund-kategorierne. Ellers vil den indeholde Kategoriid for den kategori som er et trin højere oppe end den selv.

Er det muligt, på en måde at få MySQL til at returnere alle de forhenværende kategorier til en udskrevet kategori?
Eller skal det gøres i scriptkoden omkring, og så lave en masse kald til MySQL (lyder for mig som en langsom løsning)..

Evt. forslag til en hurtig metode, eller lignende?
Avatar billede arne_v Ekspert
23. juli 2005 - 21:40 #1
Oracle kan lave det trick i SQL

du kan som du selv siger kode det i PHP

eneste alternativ jeg kender er at lave en seperat tabel:

catid  ancestor

hvor der for hver catid er en række med alle dens ancestors
Avatar billede cautoo Nybegynder
23. juli 2005 - 21:51 #2
Oki... det lyder som en løsning der trækker søm ud af serveren, den med PHP..
Hvorledes fungerer det med Oracle?
Avatar billede arne_v Ekspert
23. juli 2005 - 21:54 #3
Avatar billede Slettet bruger
23. juli 2005 - 21:56 #4
arne_v: Vil det ikke kunne laves i en rekursiv funktion i php?
Avatar billede cautoo Nybegynder
23. juli 2005 - 22:00 #5
Jeg ved ikke om vi er gået lidt forbi hinanden, eller du tænkte at det kunne laves med lidt finesse.. men
Altså, jeg vil ikke udskrive alle kategorilevels...

men hvis jeg får vist kategori 34, vil jeg have listet alle de "parent" så der ex. stod:
bundkategori - underkategori1 - underkatgori 2 - kategori34
som en slags kategoristi..
altså en slags GET_PARENT_STI AS sti
Avatar billede cautoo Nybegynder
23. juli 2005 - 22:01 #6
wicez... jeg har intet problem med at lave en funktion der gentages indtil -1 findes.. men tænkte løsningen måtte være lidt langsom, hvis man nu skal liste 30 tilfældige kategoriers "sti"
Avatar billede arne_v Ekspert
23. juli 2005 - 22:03 #7
det er ikke noget problem at lave det i PHP med en SELECT per led
Avatar billede arne_v Ekspert
23. juli 2005 - 22:05 #8
min teknik kan også bruges til det (specielt hvis du tilføjer et ekstra felt level !)

jeg kan ike lige gennemskue om Oracle kan gøre det, men det er vel heller ikke så
relevant
Avatar billede cautoo Nybegynder
23. juli 2005 - 22:11 #9
Arne.. som jeg forstår din metode, så skal jeg skrive en komplet sti i en anden database (så kunne den jo ligeså godt være i samme database)... og grunden til, at jeg ikke vil det, er at jeg så kan flytte en kategori fra et sted til et andet, blot ved at ændre parent..

mit alternativ er selvfølgelig php... hvis nogle andre skulle ønske og vide hvordan det kan gøres er her et eksempel (ikke testet):
function hentsti($id) {
  $sql_qyery = mysql_query("SELECT * FROM tabel WHERE id='" .$id. "'");
  $sql_array mysql_fetch_array($sql_qyery);
  if ($sql_array["parent"] == -1)
  return $sql_array["text"]. " ";
  else
  return hentsti($sql_array["parent"]). " - " .$sql_array["text"];
}
men tror stadig den er lidt langsom
Avatar billede arne_v Ekspert
23. juli 2005 - 22:16 #10
det er nødt til at være i en anden tabel for at være normaliseret

og det er korrekt at du skal opdatere den anden tabel også når du
flytter en kategori

mere kode men bedre performance
Avatar billede cautoo Nybegynder
23. juli 2005 - 22:28 #11
Oki.. tak for hjælpen... gider du lige svare?
Avatar billede arne_v Ekspert
23. juli 2005 - 22:29 #12
svar
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
Computerworld tilbyder specialiserede kurser i database-management

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