/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Forum i træstruktur opbygget i mysql og ph~
Fra : Karsten Fisker


Dato : 15-12-03 16:37

Jeg har brug for hjælp......

Jeg har tidligere oprettet lignende spørgsmål, men enten har jeg ikke kunnet
formulere mig godt nok, eller også er det bare for hård en nød at knække.

Hjælp, eller i det hele tage respons vedr. nedenstående er mere end
velkommen.

Her er tabellen "b91_forum":
beskednr hovedtraad tilhoersforhold headline besked
1000000001 1000000001 NULL 1
1000000002 1000000002 NULL 2
1000000003 1000000002 1000000002 2.1
1000000004 1000000002 1000000003 2.1.1
1000000005 1000000001 1000000001 1.1
1000000006 1000000002 1000000002 2.2
1000000007 1000000001 1000000001 1.2
1000000008 1000000001 1000000007 1.2.1
1000000009 1000000001 1000000001 1.3
1000000010 1000000001 1000000007 1.2.2

Hele idéen er at tabelfelterne benyttes på følgende måde:
beskednr: Benyttes til at identificere hver enkelt besked
hovedtraad: Angiver hvilken hovedtråd hver enkelt besked hører til
tilhoersforhold: Angiver hvilken tråd hver besked hører til
headline: Beskedens overskrift
besked: Selve beskeden

Hentet korrekt fra databasen, vil en udskrift af data se således ud:
1
1.1
1.2
1.2.1
1.2.2
1.3
2
2.1
2.1.1
2.2

Som I kan se, er det opbygget som en træstruktur (alá www.debatside.dk).

Jeg forventer ikke at få det hele serveret på et sølvfad, men kunne godt
bruge noget hjælp til at få den grundlæggende opbygning på plads.

Er designet af databasen helt hen i vejret, kan det også ændres.

Jeg kan simpelthen ikke gennemskue hvordan jeg får den ønskede opstilling.





 
 
Kim Bach Petersen (15-12-2003)
Kommentar
Fra : Kim Bach Petersen


Dato : 15-12-03 17:17

Karsten Fisker wrote:

> Som I kan se, er det opbygget som en træstruktur

Du kan mig bekendt ikke hente træstrukturen direkte ud af MySQL, det er du
nødt til at programmere dig til ved hjælp af rekursion.

> Er designet af databasen helt hen i vejret, kan det også ændres.

Det er helt som det skal være. Det er en god i det med det ekstra felt, som
angiver hovedtråden, da du så let kan vælge alle beskeder i en tråd ud. Du
kan overveje, om det ikke også var en idé med et timestamp, det kan gøre den
senere sortering lettere (eller skal du finde en anden måde at få fx 1.1 og
1.2 til at stå i rigtig rækkefølge).

Php-gruppen har formodentlig nogle mere konkrete bud - og ellers kunne jeg
dårligt forestille mig andet end at du må kunne finde noget open source
kildekode, du kan lade dig inspirere af.

Kim
--
http://dotnet.kensho.dk



Henning Petersen Wan~ (15-12-2003)
Kommentar
Fra : Henning Petersen Wan~


Dato : 15-12-03 23:30

"Karsten Fisker" <nospamkfisker@hotmail.com> wrote:

> Hele idéen er at tabelfelterne benyttes på følgende måde:
> beskednr: Benyttes til at identificere hver enkelt besked
> hovedtraad: Angiver hvilken hovedtråd hver enkelt besked hører til
> tilhoersforhold: Angiver hvilken tråd hver besked hører til
> headline: Beskedens overskrift
> besked: Selve beskeden

Jeg har lavet lige lignede. Ikke det samme men måske kan du bruge
princippet som inspiration:

Jeg har en table, som kobler brugere og grupper

mysql> desc grupper;
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| gruppe_id | int(11) | | PRI | NULL | auto_increment |
| gruppe_navn | varchar(50) | YES | | NULL | |
| gruppe_masters | int(11) | YES | | NULL | |
+----------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

som indeholder organisations-strukturen i min spejder-gruppe, og
benytte følgende query til at hente "org-træet" ud a databasen:

SELECT   l1.gruppe_navn AS l1_navn,
   l2.gruppe_navn AS l2_navn,
   l3.gruppe_navn AS l3_navn,
   l4.gruppe_navn AS l4_navn,
   l5.gruppe_navn AS l5_navn
FROM    grupper AS l1
LEFT JOIN grupper AS l2   ON l2.gruppe_masters = l1.gruppe_id
LEFT JOIN grupper AS l3   ON l3.gruppe_masters = l2.gruppe_id
LEFT JOIN grupper AS l4   ON l4.gruppe_masters = l3.gruppe_id
LEFT JOIN grupper AS l5   ON l5.gruppe_masters = l4.gruppe_id
WHERE   l1.gruppe_id = 999

(gruppe_id 999 er top level - null i dit eksempel)

Den leverer følgende output:
Overall master   Gruppe-ledelsen   Mikro-ledelsen   1. mikro-årgang
Overall master   Gruppe-ledelsen   Mikro-ledelsen   2. mikro-årgang
Overall master   Gruppe-ledelsen   Mini-ledelsen   1. mini-årgang
Overall master   Gruppe-ledelsen   Mini-ledelsen   2. mini-årgang
Overall master   Gruppe-ledelsen   Junior-ledelsen   1. junior-årgang
Overall master   Gruppe-ledelsen   Junior-ledelsen   2. junior-årgang
Overall master   Gruppe-ledelsen   Trops-ledelsen   1. trops-årgang
Overall master   Gruppe-ledelsen   Trops-ledelsen   2. trops-årgang
Overall master   Gruppe-ledelsen   Trops-ledelsen   3. trops-årgang
Overall master   Gruppe-ledelsen   Trops-ledelsen   4. trops-årgang
Overall master   Gruppe-ledelsen   Klan ledelsen   Klanen
Overall master   Gruppe-styrelsen

Med lidt behændighed i præsentationen kan den let omformateres til:

Overall master
   Gruppe-ledelsen   
      Mikro-ledelsen   
         1. mikro-årgang
         2. mikro-årgang
      Mini-ledelsen
         1. mini-årgang
         2. mini-årgang
      Junior-ledelsen
         1. junior-årgang
         2. junior-årgang
      Trops-ledelsen
         1. trops-årgang
         2. trops-årgang
         3. trops-årgang
         4. trops-årgang
      Klan ledelsen
         Klanen
   Gruppe-styrelsen

Jeg ved ikke om det kan bruges i dit tilfælde, ellers kan der være der
er andre der kan bruge det som inspiration.

--
Venlig hilsen / Best regards
   Henning

_H_P_C_o_n_s_u_l_t_ http://www.hpc.dk
Skoletoften 9, Blans http://www.turnsys.dk
DK - 6400 Soenderborg

Kristian Damm Jensen (16-12-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 16-12-03 23:38

Karsten Fisker wrote:

<snip>

> Hele idéen er at tabelfelterne benyttes på følgende måde:
> beskednr: Benyttes til at identificere hver enkelt besked
> hovedtraad: Angiver hvilken hovedtråd hver enkelt besked hører til
> tilhoersforhold: Angiver hvilken tråd hver besked hører til
> headline: Beskedens overskrift
> besked: Selve beskeden

Altså en træstruktur implemtenteret ved en liste af knuder. For hver
knude registreres (a) reference til roden af det pågældende træ
(hovedtraad) (2) reference til nærmeste forælder (tilhoersforhold)
samt de relevante knudedata (headline, besked).

<snip>

> Som I kan se, er det opbygget som en træstruktur (alá
> www.debatside.dk).

Træstrukturer er et klassisk problem i SQL. Der findes ingen god
løsning.

Hvis du har en kendt overgrænse for antallet af niveauer i træet, kan
du lave noget i samme retning som det Henning Petersen allerede har
beskrevet.

Hvis ikke, er du på dybt vand.

Joe Celko har i sin bog "SQL for smarties" (og han mener den titel
alvorligt! (jeg kan i øvrigt kun anbefale den bog til folk, som
betragter SQL som en væsentlig del af den fremtidige karriere) (to
indlejrede parenteser - this is getting weird)) beskrevet en måde at
implementere træstrukturer ved at betragte dem som indlejrede mængder
(det lyder mere uforståeligt end det er, men det er *ikke* let. Han
bruger 25 sider på emnet.)

Hvis du har mulighed for at skifte DBMS, så kan du med fordel studere
Oracles "connect by". Andre systemer kan have tilsvarende
konstruktioner, som jeg ikke kender til.

> Jeg forventer ikke at få det hele serveret på et sølvfad, men kunne
> godt bruge noget hjælp til at få den grundlæggende opbygning på
plads.
>
> Er designet af databasen helt hen i vejret, kan det også ændres.
>
> Jeg kan simpelthen ikke gennemskue hvordan jeg får den ønskede
> opstilling.

Nej, det kan jeg sgu godt forstå. Det er *ikke* nemt. Jeg kender ikke
php, så jeg ved ikke hvor nemt det ville være at eksportere problemet
til dette sprog, men for de fleste sprog jeg kender, ville det være
oplagt at flytte problemet ud af SQL og ind i værtssproget.

--
Kristian Damm Jensen
damm (at) ofir (dot) dk



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste