/ 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
Søgning i træstruktur, MySQL 3.23
Fra : Tinky Winky


Dato : 20-10-02 14:56

Jeg har en menu i en træstruktur på en MySQL database. I hvert punkt står
der en evt. forældre id, ellers 0. Jeg skal hive et punkt ud og alle dens
"søster" punkter og alle forældrene helt til roden, så det kan vises pænt
grafisk, ligesom fx:

-
dk.edb
dk.edb.database
dk.edb.hardware
dk.edb.hardware.bundkort
dk.edb.hardware.drev <----
dk.edb.hardware.grafikkort
.......

Man kan self. lave en SQL sætning der finder det aktuelle punkts forældre
id, derefter en ny SQL sætning, der henter alle på det "niveau", derefter en
ny sætning der henter alle på det foregående niveau osv. indtil man er til
roden. Men det giver en del SQL sætninger, kan man ikke lave det i en
sætning?

Og kan man lave det med MySQL 3.23? Den understøtter ikke subselects. Eller
kan man med version 4? Hvordan laver man den slags løkker?



 
 
Kristian Damm Jensen (20-10-2002)
Kommentar
Fra : Kristian Damm Jensen


Dato : 20-10-02 21:19

Tinky Winky wrote:
>
> Jeg har en menu i en træstruktur på en MySQL database. I hvert punkt står
> der en evt. forældre id, ellers 0. Jeg skal hive et punkt ud og alle dens
> "søster" punkter og alle forældrene helt til roden, så det kan vises pænt
> grafisk, ligesom fx:
>
> -
> dk.edb
> dk.edb.database
> dk.edb.hardware
> dk.edb.hardware.bundkort
> dk.edb.hardware.drev <----
> dk.edb.hardware.grafikkort
> .......
>
> Man kan self. lave en SQL sætning der finder det aktuelle punkts forældre
> id, derefter en ny SQL sætning, der henter alle på det "niveau", derefter en
> ny sætning der henter alle på det foregående niveau osv. indtil man er til
> roden. Men det giver en del SQL sætninger, kan man ikke lave det i en
> sætning?
>
> Og kan man lave det med MySQL 3.23? Den understøtter ikke subselects. Eller
> kan man med version 4? Hvordan laver man den slags løkker?

Subselects vil ikke hjælpe dig. Man laver *ikke* løkker i SQL.

SQL er notorisk dårligt til at understøtte træstrukturer. Der vindes
omveje, men de kræver at man ændrer sin repræsentation, altså at man
ændrer tabel-layoutet. Og så er jeg ikke engang sikker på at de besværet
værd.

En anden mulighed er at finde et rdms, der har lokale udvidelser, der
kan hjælpe. Oracle har så vidt jeg husker en funktion, der hedder
CONNECT BY, der kan løse problemet. Det ville imidlertid undre mig, hvis
MySQL har det eller får inden for nærmeste fremtid. Deres
førsteprioritet er vist at komme op på fuld speed med standard-SQL.



--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


Kim Bach Petersen (21-10-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 21-10-02 12:20

> Man kan self. lave en SQL sætning der finder det aktuelle punkts
> forældre id, derefter en ny SQL sætning, der henter alle på det
> "niveau", derefter en ny sætning der henter alle på det foregående
> niveau osv. indtil man er til roden. Men det giver en del SQL
> sætninger, kan man ikke lave det i en sætning?

Det er mig bekendt ikke muligt. Du er med andre ord nødt til at bruge en
rekursiv funktion, som gennemløber hierarkiet.

Når det er sagt, er det værd at være opmærksom på, at performance kan
variere meget afhængigt af implementeringen. Mine egne eksperimenter med
hierarkiske datasæt siger mig, at nye recordsæt for hvert niveau er
langsomst, mens programmeret sortering i hele træstrukturen (altså kun ét
SQL kald) er hurtigst (i asp.net/vb.net nemt en faktor 10 til forskel).
Træstrukturen findes som nævnt med en såkaldt rekursiv funktion - hvordan
det mere konkret gøres afhænger af, hvilket programmeringssprog, du bruger.

Afhængig af træstrukturens indhold, vil man givetvis kunne udvælge en
delmængde på forhånd, således man ikke behøver at hente og rekursere sig
igennem alle poster. I dit eksempel kan man systematisk lave en udvælgelse,
idet træets navngivning er systematisk (dk.edb.hardvare.drev ->
dk.edb.hardvare -> dk.edb -> dk).

Kim
--
· www.kensho.dk · psykologi og spiritualitet ·



Tinky Winky (25-10-2002)
Kommentar
Fra : Tinky Winky


Dato : 25-10-02 10:49

> Afhængig af træstrukturens indhold, vil man givetvis kunne udvælge en
> delmængde på forhånd, således man ikke behøver at hente og rekursere sig
> igennem alle poster. I dit eksempel kan man systematisk lave en
udvælgelse,
> idet træets navngivning er systematisk (dk.edb.hardvare.drev ->
> dk.edb.hardvare -> dk.edb -> dk).

Så skal jeg vel hente alle poster for menuen på en gang i een SQL sætning og
derefter lade programmet rekursivere sig igennem det? Medmindre jeg laver
nogle snedige ekstra felter. Sålænge menuen ikke er enorm, er det vel også
OK.



Kim Bach Petersen (25-10-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 25-10-02 16:30

> Så skal jeg vel hente alle poster for menuen på en gang i een SQL
> sætning og derefter lade programmet rekursivere sig igennem det?
> Medmindre jeg laver nogle snedige ekstra felter. Sålænge menuen ikke
> er enorm, er det vel også OK.

Ja.

Men faktisk slog det mig lige, at hvis datastrukturen er som skitseret, kan
du faktisk 'snyde':

Hent alle poster for menuen sorteret alfabetisk - det giver dig faktisk et
datasæt, der er ordnet efter hierarkiet! Der vil så skulle laves niveauer,
men det kan du let og elegant gøre ved blot at tælle antallet af
punktum'er - antal punktum'er er lig dybden i hierarkiet - meget simpelt og
en del hurtigere end rekursion.

Kim

--
· www.kensho.dk · psykologi og spiritualitet ·



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste