WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Kategorier samt underkategorier (https://www.wn.se/forum/showthread.php?t=20194)

zilveer 2007-03-25 13:59

Hejsan,
jag försöker lära mig hur man på bästa sätt kan relatera kategorier samt flera underkategorier till varandra i en mysql databas.

Man ska t.ex. kunna navigera till:
*Kläder->damkläder->byxor-> storlek42/44 (byxor i storlek42/44 som finns i databasen visas.)
*Hemelektronik->Förstärkare, stereo (förstärkare och stereon skall visas)
*Mobiltelefoni & Tele->Sony Ericsson (sony ericsson telefoner skall listas)
*Datorer -> Bärbara datorer -> dell (samtliga dell datorer skall visas)
*antik och design -> ikoner (samtliga ikoner som skall visas.)


jag vet ju självklart hur man listar dessa data t.ex. dell datorer, byxor, ikoner.
mitt problem är att jag inte vet hur jag ska lägga upp detta i databasen och relatera de till varandra på bästa sätt.
jag vill ju självklart ha så att indexeringen i databasen blir så effektiv som möjligt.
förslag på hur jag kan lägga upp detta?

/tacksam för all vägledning, mvh zilveer

eliasson 2007-03-25 15:48

Kod:

id | sub | title
1 | 0 | Datorer
2 | 0 | Kläder
3 | 0 | Frimärken
4 | 3 | Internationella
5 | 1 | Bärbara
6 | 1 | Stationära
7 | 5 | Standard
8 | 5 | Ultraportabel
9 | 5 | Presentation

Output:
Datorer
 Bärbara
  Standard
  Ultraportabel
  Presentation
 Stationär
Kläder
Frimärken
 Internationella

Nått i den stilen, om du nu syftade på databas uppbyggnad.

zilveer 2007-03-25 17:09

hejsan,
tack för svar. jo det var precis så jag menade.
hur blir det med indexeringen om man väljer att bygga upp den som du visade?

jag fick ett annat svar då jag postade den i ett annat forum:
-----------------
Gör en "kategori" tabell där du matar in alla olika kategorier. Ha där en kolumn som t.ex "parent_id", alltså något i stuk med:

category_id - category_name - parent_id
1 - Datorer - 0
2 - Bärbara datorer - 1
3 - Dell - 2
4 - HP - 2

Alltså, kategorier med parent id 0 är huvudkategorier sen följer subkategorier som pekar på vilken kategori den tillhör.
Och sen får du ha en category_id på varje produkt, alternativt en egen tabell om samma produkt ska kunna förekomma i flera kategorier.
------------------

vilket är det bästa sättet att bygga databasen på?

zilveer 2007-03-25 18:19

skulle du kunna visa med php/mysql kod hur du får ut output:en?

tack för all vägledning

eliasson 2007-03-25 19:00

Jag hade en gång en fin liten kodsnutt för att skriva ut en sådan sak men vet inte vart den tog vägen. Postar den här om jag råkar hitta den -- tills vidare får du lära dig lite SQL. Nu har jag förklarat hur du lättast bygger upp det och det kvarstår bara att skriva ut det precis som vi vill ha det.

fors 2007-03-25 20:11

Citat:

Originally posted by zilveer@Mar 25 2007, 17:09
hejsan,
tack för svar. jo det var precis så jag menade.
hur blir det med indexeringen om man väljer att bygga upp den som du visade?
jag fick ett annat svar då jag postade den i ett annat forum:
-----------------
Gör en kategori tabell där du matar in alla olika kategorier. Ha där en kolumn som t.ex parent_id, alltså något i stuk med:
category_id - category_name - parent_id
1 - Datorer - 0
2 - Bärbara datorer - 1
3 - Dell - 2
4 - HP - 2
Alltså, kategorier med parent id 0 är huvudkategorier sen följer subkategorier som pekar på vilken kategori den tillhör.
Och sen får du ha en category_id på varje produkt, alternativt en egen tabell om samma produkt ska kunna förekomma i flera kategorier.
------------------
vilket är det bästa sättet att bygga databasen på?

Det är väl precis samma som eliasson skrev, bortsett från valen av kolumnamnen.

Nåväl, jag googlade lite snabbt och fann följande länk:
http://www.sitepoint.com/article/hie...-data-database

Jag har inte läst igenom ovanstående länk, men förhoppningsvis får du ut någonting av den.

zilveer 2007-03-25 20:43

fors:
jag förstod inte det som så.

tack för länken, ska ta en titt

fors 2007-03-26 00:22

Citat:

Originally posted by zilveer@Mar 25 2007, 20:43
fors:
jag förstod inte det som så.
tack för länken, ska ta en titt

Jag har aldrig skrivit en sådan meny förut, så jag blev sugen på att göra det. Säg gärna till om du vill ha källkoden till min variant.

melin 2007-03-26 01:59

min funktion: hämta poster som hör till IDnr=0
sql är nu: hämta alla med subID=IDnr
kör sql
skriv ut resultat
kör funktion: hämta poster som hör till IDnr=ID
slut på funktion


nåt sånt där.. plocka fram alla som har subID 0.. för varje träff gå in och gör samma sub-rutin igen men plocka nu ut alla som har samma subID som det ID du nyss sprang på

Björn 2007-03-26 02:37

Men då blir det flera frågor mot databasen... kan man inte hämta alla kategorier, sen lägga dem i en array, och därifrån hantera datat. Loopa genom den och gör precis som du sa där melin.

Magnus_A 2007-03-26 09:40

Det beror ockås lite på hur pass exklusiva underkategorierna är, dvs om de kommer att figurera i mer än en huvudkategori. Eller om du kommer nån gång i framtiden att ha under-underkategorier.


Och vad är problemet? Att hitta grejerna eller att skriva ut trädet utifrån den grenklyka man befinner sig just nu?

Ett tips är att tänka igenom databasens och tabellernas konstruktion noga så att det blir lätt att skala den i olika dimensioner och det går lätt att hitta det du behöver. Att lappa och laga med kod och frågor i efterhand är bara bökigt.

Timofey 2007-04-06 19:29

Citat:

Originally posted by eliasson@Mar 25 2007, 19:00
Jag hade en gång en fin liten kodsnutt för att skriva ut en sådan sak men vet inte vart den tog vägen. Postar den här om jag råkar hitta den -- tills vidare får du lära dig lite SQL. Nu har jag förklarat hur du lättast bygger upp det och det kvarstår bara att skriva ut det precis som vi vill ha det.

Vore bra om du eller någon annan kunde ta fram en sådan :)
Tänker inte riktigt rätt...

Edit: 888 inlägg =)))

Timofey 2007-04-07 18:02

Jag löste detta med array. Dock måste man kopiera koden om man vill ha en djupare struktur än 3-e nivån.


Kod:

// 0 - id, 1 - sub, 2 - title
// Max: 3 - level

for ($k=0; $k<count($catrows); $k++) {
        if ($catrows[$k][1] == '0') {
        $link = $catrows[$k][0];
        echo "<br /><a href='page.php?id=$link'>";
        echo $catrows[$k][2];
        echo "</a>";
        echo "<br />";
        $idd = $catrows[$k][0];
 for ($l=1; $l<count($catrows); $l++) {
        if ($catrows[$l][1] == $idd) {
        $link = $catrows[$l][0];
        echo "- <a href='page.php?id=$link'>";
        echo $catrows[$l][2];
        echo "</a>";
        echo "<br />";
        $iddd = $catrows[$l][0];
  for ($m=0; $m<count($catrows); $m++) {
          if ($catrows[$m][1] == $iddd) {
          $link = $catrows[$m][0];
          echo "- <a href='page.php?id=$link'>";
          echo $catrows[$m][2];
          echo "</a>";
          echo "<br />";
          }
  }
        }
 }
        }
}


Björn 2007-04-08 11:28

Går att lösa med rekursiva funktioner tror jag det heter... att den traverserar ner alla nivåer.

guran 2007-04-08 13:20

Detta är faktiskt en riktigt klurig sak rent progammeringsmässigt och det finns lite artiklar på webben om hur man bygger trädmenyer.

Jag har t.ex. löst en kategorivandring där man klickar på en kategori och får upp underkategorier och så vidare genom att ha ett fält i tabellen där jag helt enkelt skriver in hela sökvägen till just ett ämnes kategori. Sökvägen i fältet ser ut enligt följande:

fordon/bilar
fordon/lastbilar
fordon/lastbilar/över 3,5 ton
fordon/lastbilar/under 3,5 ton
fordon/båtar
fordon/båtar/segelbåtar
fordon/båtar/segelbåtar/katamaraner
fordon/båtar/segelbåtar/skonare
fordon/båtar/motorbåtar
osv.

Ovan är bara ett exempel. Sedan gäller de ju bara att skriva kod som kan tolka ovanstående och plocka fram de ämnen som är har en viss kategori.

fors 2007-04-08 17:24

Jag skrev som sagt ihop ett träd snabbt för ett tag sedan. Jag har inte lagt ner så mycket tid på koden, men ni får gärna förbättra den om det går.

Demo: http://www.niklasfors.com/treemenu.php
Källkod: http://www.niklasfors.com/treemenu.phps

eliasson 2007-04-09 10:06

Du får nog ta och kolla över din kod lite:
Warning: Invalid argument supplied for foreach() in /var/www/niklasfors.com/treemenu.php on line 58


Inget allvaligt direkt men är ganska fult : )

fors 2007-04-09 12:33

Citat:

Originally posted by eliasson@Apr 9 2007, 10:06
Du får nog ta och kolla över din kod lite:
bWarning/b: Invalid argument supplied for foreach() in b/var/www/niklasfors.com/treemenu.php/b on line b58/bbr /
Inget allvaligt direkt men är ganska fult : )

Oj, det har jag missat. Men nu skall det vara fixat.


Alla tider är GMT +2. Klockan är nu 22:46.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson