Avatar billede kimlarsen1978 Nybegynder
01. maj 2008 - 17:28 Der er 8 kommentarer og
2 løsninger

Dynamisk opbygning af SELECT?

Hejsa
Spørgsmålet er oprettet her, da jeg forventer nedenstående skal løses med nogle hjælpefunktioner i ASP.

Problemet:
Jeg har en tabel med en masse tekster i (items hedder tabellen), disse refererer med et kategori id (katid hedder feltet) til en anden tabel (kategorier hedder den tabel), hvor katagorierne er i.

kategoritabellen har denne opbygning:
id  parent    kategori
1    0          HovedkategoriA
2    0          HovedkategoriB
3    2          UnderkategoriA til hovedkategoriB
4    2          UnderkategoriB til hovedkategoriB
5    2          UnderkategoriC til hovedkategoriB
6    4          UnderkategoriA til underkategoriB
også videre...

Hvordan får jeg bygget en SELECT sammen til items, hvor jeg får alle poster der matcher en kategori og alle dennes tilhørende underkategori?

Altså hvis jeg kommer med katid = 2, skal jeg ud fra det have opbygget en SELECT ned i items:

SELECT * FROM items WHERE (katid = 2 OR katid = 3 OR katid = 4 OR katid = 5 OR katid = 6)

Så jeg får alle de poster der matcher kategorien 2 eller en af dennes underkategorier.

Hvis jeg fx var kommet med katid = 4, skal resultatet være:
SELECT * FROM items WHERE (katid = 4 OR katid = 6)

Hvis jeg fx var kommet med katid = 3, skal resultatet være:
SELECT * FROM items WHERE (katid = 3)

Er spørgsmålet til at forstå?
Håber der er en eller flere der kan hjælpe.

Mange tak.
Avatar billede bondester Nybegynder
01. maj 2008 - 17:52 #1
Kan du ikke lave et dump af strukturen i din DB??
Så tror jeg bedre jeg kan hitte ud af det...
Avatar billede kimlarsen1978 Nybegynder
01. maj 2008 - 18:18 #2
ITEMS:
CREATE TABLE IF NOT EXISTS `items` (
  `ID` int(11) NOT NULL auto_increment,
  `ipadresse` varchar(50) collate latin1_danish_ci default NULL,
`katid` int(11) NOT NULL ,
  `overskrift` varchar(50) collate latin1_danish_ci default NULL,
  `tekst` text collate latin1_danish_ci,
  `avistekst` text collate latin1_danish_ci NOT NULL,
  UNIQUE KEY `ID` (`ID`),
  ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=37529 ;

KATEGORIER
CREATE TABLE IF NOT EXISTS `Kategorier` (
  `id` int(11) NOT NULL auto_increment,
  `parentid` int(3) NOT NULL,
  `kategori` varchar(50) collate latin1_danish_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=67 ;

Var det det du mente?
Avatar billede kimlarsen1978 Nybegynder
01. maj 2008 - 18:21 #3
Det er en MySQL DB
Avatar billede bondester Nybegynder
01. maj 2008 - 23:12 #4
Lige uden at have testet det tror jeg noget lignende dette kunne bruges:

Dim intKatID, strSQL

intKatID = "2" '//Eller det tal der nu skal søges efter!

Set rsKats    =    Conn.Execute("SELECT * FROM `Kategorier` WHERE `parentid` = '" & intKatID  & "'"

'// Opbygning af SQL-streng
strSQL = "SELECT * FROM items WHERE (katid = " & intKatID

If Not rsKats.EOF Or rsKats.BOF Then
    Do
        strSQL = strSQL & " OR katid = " & rsKats("id")
    rsKats.MoveNext
    Loop While Not rsKats.EOF
End If

strSQL = strSQL & ")"

'// Execute på items-tabel
Set rsItems    =    Conn.Execute(strSQL)
Avatar billede kimlarsen1978 Nybegynder
02. maj 2008 - 00:06 #5
Hejsa
Tak for kommentaren. Men det tager "vel kun" første niveau, hvad nu hvis en underkategori har underkategorier?

Hvis jeg kommer med katid = 2, skal resultatet blive: SELECT * FROM items WHERE (katid = 2 OR katid = 3 OR katid = 4 OR katid = 5 OR katid = 6)

Men ovenstående eksempel misser vi katid = 6, og resultatet bliver: SELECT * FROM items WHERE (katid = 2 OR katid = 3 OR katid = 4 OR katid = 5)
Avatar billede kimlarsen1978 Nybegynder
02. maj 2008 - 10:42 #6
Jeg kender jo ikke hvor dybt min kategorisering går, derfor skal det laves dynamisk til et ukendt antal niveauer
Avatar billede kimlarsen1978 Nybegynder
02. maj 2008 - 15:44 #7
Jeg må lave noget med et rekursivt kald, jeg tror jeg har fået en løsning tænkt frem gennem de sidste 24 timer :). Jeg vender lige tilbage
Avatar billede kimlarsen1978 Nybegynder
02. maj 2008 - 22:13 #8
Så fik jeg lavet en lille funktion der kan give mig alle ID på en kategories underpunkter i n niveauer. Listen brugerne jeg så til at danne SQL'en med senere

Til dem der måtte have gavn af det, så er funktionen her:

strIDList = getIDListForSubCategories(2, 1, 1)

Function getIDListForSubCategories(strKatIDs, blnRecoursiv, blnReturnStartValue)
    'Find ID på alle de underkategorier den eller de medsendte kategori har
   
    strTempIDList = ""
    strFinalIDList = ""   
   
    'Split den medsendte streng i ID'erog løb dem igennem
    arrayOfIDs = split(strKatIDs,",")
    for i = 0 to ubound(arrayOfIDs)
        'Select alle de kategorier der er underkategori til den aktuelle kategori
        strSQL = "SELECT * FROM kategorier WHERE parentid = " & arrayOfIDs(i) & ""
        Set rsKats = Conn.Execute(strSQL)
       
        'Gem den fundne, men tjek først om startværdien skal returneres
        if blnReturnStartValue = 1 then
            if strFinalIDList <> "" then
                strFinalIDList = strFinalIDList & "," & arrayOfIDs(i)
            else
                strFinalIDList = arrayOfIDs(i)
            end if
        end if
       
        'Opsammel ID på underkategorierne, så vi kan tjekke om de har underkategorier
        If Not rsKats.EOF Or rsKats.BOF Then
            Do until rsKats.EOF
                if strTempIDList <> "" then
                    strTempIDList = strTempIDList & "," & rsKats("id")
                else
                    strTempIDList = rsKats("id")
                end if
                rsKats.MoveNext
            Loop           
        End if
    next
    if blnRecoursiv = 1 then
        if strTempIDList <> "" then
            'Kald igen med underkategorierne for at få deres underkategorier
            strFinalIDList = strFinalIDList & "," & getIDListForSubCategories(strTempIDList,blnRecoursiv,1)
        end if       
    else
        strFinalIDList = strTempIDList
    end if
    getIDListForSubCategories = strFinalIDList
End Function

bondester:
Smid et svar så deler vi, jeg bruger en del af det du skrev til efterfølgende at lave SQL'en
Avatar billede bondester Nybegynder
03. maj 2008 - 19:34 #9
Nååå ja havde ikke lige tænkt på underpunkterne....
Håber dukunne bruge noget af det ;-)
Avatar billede kimlarsen1978 Nybegynder
04. maj 2008 - 13:14 #10
Tak
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
Kurser inden for grundlæggende programmering

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