23. februar 2005 - 10:01Der er
10 kommentarer og 1 løsning
Søgning på kryds af tabeller
Hejsa, Jeg skal lave en funktion, som skal kunne søge i en række forskellige felter placeret i forskellige tabeller.
Jeg har en tabel kaldet main_item, hvor alle produkter er oprettet. Her skal man kunne søge på "item_no" som er id'et for hvert produkt. Derudover er der et felt der hedder "item_type" som angiver hvilken type produkt der er tale om.
Er item_type = axle, så eksisterer der en record i "item_axle"-tabellen, med samme item_no, og her kan man så finde endnu flere informationer om præcis dette produkt.
Problemet er bare, at jeg skal lave en søgefunktion, som kan søge på "item_no" i "main_item"-tabellen OG søge på individuelle felter i de underliggende tabeller.
Kunne forestille mig at du skal have fat i noget JOIN. Jeg kan desværre ikke give en konkret eksempel da der er ved at være mange år siden jeg sidst har arbejdet med ASP. Tjek dog den her artikel http://activedeveloper.dk/artikler/default.asp?articleid=323 :o)
Vil tro du skal bruge et left join. Sikkert noget i denne stil:
SELECT main_item.* FROM main_item LEFT JOIN item_axle ON item_axle.item_no = main_item.item_no WHERE (main_item.name LIKE '%søgeOrd%' OR item_axle.description LIKE '%søgeOrd%')
nænæ... item_no er primary key... men altså, har jo nogle værdier i eks. item_axle som jeg gerne vil have printet på skærmen...
og jeg har også 8 andre tabeller som skal søges i.. hvordan gør jeg det??
Eks:
I main_item er der en record som har item_no = 28, og item_type = "axle", dette fortæller os at der også findes en record i item_axle som har item_no = 28.
Men lad os så sige at vi har en record i main_item som har item_no = 29, og item_type = "tire", så ved vi at der findes en record i item_tire som har item_no = 29, og så kan vi nu hente info om dette produkt fra item_tire.
Det gør det jo lidt mere indvklet :o) Ved ikke om det kan lade sig gøre. Da et felt skal bestemme, hvilken tabel der skal joines på.
Jeg vil dog tro at det stadig virker hvis du left joiner alle tabellerne sammen: SELECT * FROM main_item LEFT JOIN item_axle ON item_axle.item_no = main_item.item_no LEFT JOIN item_tire ON item_tire.item_no = main_item.item_no ... ...
Du får dog en masse kolonner på hver post som er NULL, men det er jo ligemeget. Når du udskriver tjekker du så item_type også ved du hvilke kolonner der skal udskrives. Denne metode betyder dog at, med bortset fra item_no, må ingen felter hedde det samme. Dette gælder også på tværs af tabellerne, så der kan ikke være et felt der hedder "description" på flere af dem. Ellers skal du bruge index nummeret til at udskrive med:
response.write rs("etFelt") kan også udskrives med: response.write rs(3) '<-- tilsvarende nummer på select listen.
Wohoo, jeg har lige talt med kunden og han havde glemt at fortælle at han ville have en dropdown, hvor man så vælger hvilken item-type man vil søge på. Det gør det jo unægteligt lidt nemmere.
Det er ret smart det der med index-nummeret. Det vidste jeg ikke at man kunne på den måde. Det optimerer vel også koden en del? Thi jeg har over 50.000 produkter i databasen...
Det er ikke ret meget du henter, og da det kun er ved udskrift skal du nok udskrive alle 50000 produkter på en gang inden du opnår noget :o)
Det er mest brugt til dynamiske sql-sætninger, hvor brugeren selv har indflydelse, så man ikke hved hvilke felter/hvor mange der er på listen. Man kan så løbe dem igennem med en løkke til der opstår en fejl, som betyder der ikke er flere kolonner.
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.