Avatar billede Slettet bruger
27. april 2005 - 21:41 Der er 55 kommentarer og
1 løsning

En form for løkke der finder ting med "over"

Jeg har en database med et "id" (unikt) og et "over" felt (begge int).
I forvejen har jeg en variabel med en værdig (f.eks. 5). Jeg vil derefter gerne have alle de rækker, der enten har "over" til 5. Eller de rækker, der har et id der er lig med id'et i en række med over=5. Og på den måde skal det køre. Ex:

række1 = id=3, over=1
række2 = id=4, over=3
række3 = id=5, over=4
række4 = id=6, over=8
række5 = id=7, over=3

$var = 3;

Her vil jeg gerne have fat i række 1, 2, 3 og 5, men ikke række 4 da den ikke på nogen måde har forbindelse med række med id'et 3.

Hvis $var = 4 vil jeg kun have fat i række 2 og 3.


Jeg håber at det er forståeligt.!
Avatar billede Slettet bruger
27. april 2005 - 21:48 #1
Det er vel ca. det samme (præcis det samme?) som der er her på exp.dk hvis man f.eks. trykker på "databaser", finder den også alle kategorier indenfor både MySQL og Access osv.
Avatar billede Slettet bruger
27. april 2005 - 21:59 #2
Hvis det ikke kan lade sig gøre vil jeg også gerne have dette at vide, da jeg jo så bliver nødt til at finde på noget andet.. Men jeg regner da med at det kan lade sig gøre da "systemet" findes her på sitet.
Avatar billede arne_v Ekspert
27. april 2005 - 22:01 #3
Hvis det kun er et niveau så er den nem:

... WHERE id=x OR over=x

men du vil også have række3 med for x=3

jeg tror at du har brug for en ændring i database struktur

f.eks. en ny tabel med 2 felter

id descendant
1    3
3    4
1    4
4    5
3    5
1    5
3    7
1    7
6    8

så er det nemt at finde
Avatar billede arne_v Ekspert
27. april 2005 - 22:02 #4
Det er nok nemmere for Eksperten da strukturen er rimelig fast.
Avatar billede Slettet bruger
27. april 2005 - 22:04 #5
Forstår ikke helt dit eksempel med ny struktur. Det kan sagtens lade sig gøre med den nye struktur, da jeg ikke er begyndt at "udfylde" mit system endnu :o)
Avatar billede Slettet bruger
27. april 2005 - 22:05 #6
Forstår godt dit system, skulle bare lige tænke mig om.
Du vil i stedet for at lave en "over", have mig til at lave en "under", ikke?
Avatar billede arne_v Ekspert
27. april 2005 - 22:06 #7
næh

det er nærmere

[parent] [children or grandchildren or ...]
Avatar billede Slettet bruger
27. april 2005 - 22:07 #8
Men da jeg bliver nødt til at have et unikt id, skal jeg vel have 3 kolonner:

id (unikt), pid(int), descendant(int).
Avatar billede arne_v Ekspert
27. april 2005 - 22:07 #9
Hvis du har

1
3
4

og vil tilføje 5 under 4 så skal der tilføjes 3 rækker:

4    5
3    5
1    5
Avatar billede Slettet bruger
27. april 2005 - 22:08 #10
Ahh så du mener at jeg skal have en ekstra tabel, der så skal "forene" den anden tabels id'er?
Avatar billede arne_v Ekspert
27. april 2005 - 22:08 #11
det skal være en seperat tabel

med begge felter som en delt primær nøgle
Avatar billede arne_v Ekspert
27. april 2005 - 22:09 #12
den vil gøre søgning meget nemmere

og indsæt mere bøvlet

men da man normalt søger meget mere end man indsætter så ...
Avatar billede Slettet bruger
27. april 2005 - 22:09 #13
I dit eksempel med at tilføje 5 under 4.. Der tilføjer du vel også 5 under 3 og 1, ikke?
Avatar billede Slettet bruger
27. april 2005 - 22:10 #14
Ok er helt med. Jeg vil prøve i morgen, da jeg har tænkt mig at begynde på lidt skolearbejde nu. Hvis du lægger et svar, skal du få point.

Jeg skal nok brokke mig hvis jeg ikke kan finde ud af det :o)
Avatar billede arne_v Ekspert
27. april 2005 - 22:11 #15
Et helt andet approach var at bruge string værdier:

1.3
1.3.4
1.3.4.5
1.3.7
6.8

Og så lave en søgning:

... WHERE id LIKE '%.3' OR id LIKE '%.3.%'
Avatar billede Slettet bruger
27. april 2005 - 22:11 #16
Jep, Jeg er ikke så meget for at have flere "nøgler" i en kolonne, derfor vil jeg helst følge dit første råd :o)
Avatar billede arne_v Ekspert
27. april 2005 - 22:11 #17
Oracle har iøvrigt en indbygget feature til at understøtte netop det her.
Avatar billede arne_v Ekspert
27. april 2005 - 22:11 #18
svar
Avatar billede Slettet bruger
27. april 2005 - 22:13 #19
Jeg forsøger i morgen, så ser vi hvor godt det går :o)
Avatar billede Slettet bruger
28. april 2005 - 19:43 #20
Lige for at vende lidt tilbage. Kan man ikke joine den samme tabel igen, hvis man kalder den første ved et alias e.l., (Jeg regner ikke med at der bliver flere end 3 lag)

SELECT
  -
  -
FROM
  tabel1 as 1
  INNER JOIN tabel1 as 2 ON 2.id = 1.id
WHERE
  1.over=4
Avatar billede arne_v Ekspert
28. april 2005 - 19:50 #21
Hvis der er et max. på "link dybde" så kan du:

(SELECT t1.* FROM tabel t1 WHERE t1.id=X)
UNION
(SELECT t1.* FROM tabel t1,tabel t2 WHERE t1.over=t2.id AND t2.id=X)
UNION
(SELECT t1.* FROM tabel t1,tabel t2,tabel t3 WHERE t1.over=t2.id AND t2.over=t3.id AND t3.id=X)
Avatar billede Slettet bruger
28. april 2005 - 20:00 #22
Der er ikke angivet et max, men der er et naturligt maksimum, da der her er tale om kategorier indenfor cykeludstyr. Så jeg tror jeg vælger din sidste løsning, da den ikke kræver så meget ekstra indsættelses-arbejde :o)
Avatar billede Slettet bruger
29. april 2005 - 13:10 #23
Jeg har prøvet at lave en UNION nu, men det går galt. Den siger at der er syntaks fejl:


(SELECT
            tilbehoer1.id as t1
        FROM
            tilbehoer1
        WHERE
            over='". $sid ."' )
        UNION
        (SELECT
            tilbehoer2.id as t2
        FROM
            tilbehoer2
        WHERE
            over=t1)
        (SELECT
            tilbehoer3.id as t3
        FROM
            tilbehoer3
        WHERE
            over=t2)
        (SELECT
            tilbehoer4.id as t4
        FROM
            tilbehoer4
        WHERE
            over=t3)


$sid = 1.
Avatar billede Slettet bruger
29. april 2005 - 13:11 #24
(SELECT
            tilbehoer1.id as t1
        FROM
            tilbehoer as tilbehoer1
        WHERE
            over='". $sid ."' )
        UNION
        (SELECT
            tilbehoer2.id as t2
        FROM
            tilbehoer as tilbehoer2
        WHERE
            over=t1)
        (SELECT
            tilbehoer3.id as t3
        FROM
            tilbehoer as tilbehoer3
        WHERE
            over=t2)
        (SELECT
            tilbehoer4.id as t4
        FROM
            tilbehoer as tilbehoer4
        WHERE
            over=t3)


Den sidste er den rigtige.!
Avatar billede Slettet bruger
29. april 2005 - 13:13 #25
Jeg havde glemt at skrive "UNION" mellem dem, det må du undskylde.!
Avatar billede arne_v Ekspert
29. april 2005 - 17:14 #26
:-)
Avatar billede Slettet bruger
29. april 2005 - 20:38 #27
Jeg vil ikke lave det så "statisk", at der bliver nødt til at være et limit. Derfor vælger jeg at lave en rekursiv funktion. Så jeg vil ikke bruge din hjælp lige nu, men gemme den til en anden god gang :o) - Endnu en gang tak Arne Vajhøj.
Avatar billede Slettet bruger
29. april 2005 - 22:54 #28
I stedet for at "give op", vil jeg i stedet prøve at få dette til at lykkes. Man kommer jo ingen vegne hvis man giver op :o)
Avatar billede arne_v Ekspert
29. april 2005 - 22:57 #29
Det er rigtigt !
Avatar billede Slettet bruger
29. april 2005 - 23:02 #30
Er det helt umuligt at lave en løkke i ren MySQL?
Avatar billede arne_v Ekspert
29. april 2005 - 23:07 #31
version 5 og stored procedures : muligt

ellers : umuligt
Avatar billede Slettet bruger
29. april 2005 - 23:07 #32
Jeg har set lidt på mysql.com under loop og while (og ITERATE), men jeg kan ikke helt se hvor eller hvordan man kan bruge dem i en query.
Avatar billede Slettet bruger
29. april 2005 - 23:08 #33
Okay. Jeg kører ikke med version 5.. Øv :o)
Avatar billede Slettet bruger
29. april 2005 - 23:23 #34
Kender du noget til fejlen:

The used SELECT statements have a different number of columns
Avatar billede Slettet bruger
29. april 2005 - 23:24 #35
I en union
Avatar billede arne_v Ekspert
29. april 2005 - 23:29 #36
Alle SELECT i en UNION skal returnere det samme antal kolonner.

(SELECT f1,f2 FROM t1)
UNION
(SELECT f1,f2,f3 FROM t2)

duer ikke

men

(SELECT f1,f2,NULL FROM t1)
UNION
(SELECT f1,f2,f3 FROM t2)

bør være OK

ditto med

(SELECT f1,f2,'' FROM t1)
UNION
(SELECT f1,f2,f3 FROM t2)

hvis det passer bedre
Avatar billede Slettet bruger
29. april 2005 - 23:32 #37
Nå ja det var logisk nok. Jeg tænkte (ved ikke helt hvorfor) at der var forskelligt antal rækker. Så jeg var lidt forvirret :o)
Avatar billede Slettet bruger
29. april 2005 - 23:37 #38
Jeg kan ikke rigtig finde ud af at tage værdier fra den første union, og føre dem hen i den næste.

SELECT
            t.*
        FROM
            tilbehoer_v as t
        WHERE
            t.over='". $sid ."'
        UNION
            SELECT
                t1.*
            FROM
                tilbehoer_v as t,
                tilbehoer_v as t1
            WHERE
                t1.over=t.id
            OR
                t1.over='". $sid ."'
Avatar billede arne_v Ekspert
29. april 2005 - 23:39 #39
det skal du vel heller ikke ??
Avatar billede Slettet bruger
29. april 2005 - 23:41 #40
Jeg skal jo have den gamle `id`, for at kunne finde den nye `over`
Avatar billede arne_v Ekspert
29. april 2005 - 23:43 #41
28/04-2005 19:50:55

bruger kun X
Avatar billede Slettet bruger
29. april 2005 - 23:45 #42
Nej. Du har ret. Jeg har lavet en hel masse rod i det. Jeg har 2 tabeller:

tilbehoer (Heri er kun kategorier, ingen "varer" overhovedet):

id,
over (Fortæller hvilket "punkt" der er over denne række's),
navn,
beskrivelse

tilbehoer_v (Heri er kun varer.)

id,
over (Fortæller til hvilken "kategori" dette punkt hører.),
navn,
pris
Avatar billede Slettet bruger
29. april 2005 - 23:47 #43
Det må du undskylde, jeg ved ikke hvorfor jeg er blevet ved med at køre i det andet. Jeg har simpelthen ikke tænkt mig om.!
Avatar billede Slettet bruger
29. april 2005 - 23:51 #44
Jeg ville blive virkelig glad hvis du har lyst til at hjælpe mig lidt mere, selvom jeg til fulde er klar over at jeg har dummet mig big time her :o|
Avatar billede arne_v Ekspert
29. april 2005 - 23:58 #45
den skal jeg vist kigge på med friske øjne inden jeg kommer med et forslag => først
imorgen engang
Avatar billede Slettet bruger
30. april 2005 - 00:04 #46
Jep. Mange tak fordi du stadig har mod på at hjælpe :o)

Jeg tror også at jeg skal have lidt søvn. Jeg kommer først til en computer i morgen klokken 18-18.30 ca.
Avatar billede Slettet bruger
30. april 2005 - 18:11 #47
Du skal bare sige til hvis du ikke har forstået det helt :o)

Og jeg opretter et nyt spg til point når det er løst. Vi kan vel ligeså godt fortsætte her indtil det er løst, ikke?
Avatar billede arne_v Ekspert
30. april 2005 - 19:45 #48
Prøv:

(SELECT tilbehoer_v.* FROM tilbehoer_v,tilbehoer t1 WHERE tilbehoer_v.over=t1.id AND t1.id = X)
UNION
(SELECT tilbehoer_v.* FROM tilbehoer_v,tilbehoer t1,tilbehoer t2 WHERE tilbehoer_v.over=t1.id AND t1.over=t2.id AND t2.id = X)
UNION
(SELECT tilbehoer_v.* FROM tilbehoer_v,tilbehoer t1,tilbehoer t2,tilbehoer t3 WHERE tilbehoer_v.over=t1.id AND t1.over=t2.id AND t2.over=t3.id AND t3.id = X)
Avatar billede Slettet bruger
30. april 2005 - 19:59 #49
Hvordan kan det være at:
1. du sætter parentes rundt om dine UNION's, da manualen ikke gør det.

2. Du siger "FROM", alle de foregående tabeller i dine nye joins. Måske har jeg ikke helt forstået idéen i union? :o)
Avatar billede arne_v Ekspert
30. april 2005 - 20:01 #50
parenteserne er bare for at gøre det tydeligere hvad der hører sammen
Avatar billede arne_v Ekspert
30. april 2005 - 20:02 #51
en UNION stabler resultatet af 2 helt uafhængige SELECT sætninger oven på hinanden
Avatar billede Slettet bruger
30. april 2005 - 20:03 #52
Nååh, nu er jeg med :o), jeg skulle bare lige have den kickstartet. :o)
Jeg afprøver den om ½ times tid, når jeg sidder hjemme. Mange tak arne.
Avatar billede Slettet bruger
30. april 2005 - 20:26 #53
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

(SELECT tilbehoer_v.* FROM tilbehoer_v,tilbehoer t1 WHERE tilbehoer_v.over=t1.id AND t1.id = '0')
UNION
(SELECT tilbehoer_v.* FROM tilbehoer_v,tilbehoer t1,tilbehoer t2 WHERE tilbehoer_v.over=t1.id AND t1.over=t2.id AND t2.id = '0')
UNION
(SELECT tilbehoer_v.* FROM tilbehoer_v,tilbehoer t1,tilbehoer t2,tilbehoer t3 WHERE tilbehoer_v.over=t1.id AND t1.over=t2.id AND t2.over=t3.id AND t3.id = '0'
Avatar billede Slettet bruger
30. april 2005 - 20:27 #54
Her er $sid = '0'. Jeg kan ikke helt finde fejlen. (de sidste to linier er linie 5)
Avatar billede Slettet bruger
30. april 2005 - 20:29 #55
Manglende slutparentes. Den tager jeg på min kappe.
Avatar billede Slettet bruger
30. april 2005 - 20:31 #56
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