26. januar 2004 - 12:02Der er
14 kommentarer og 1 løsning
Kan denne søgning lade sig gøre? (mange-til-mange relation)
Nu er jeg vist ved at stirre mig blind på muligheder i denne søgning, så nu bliver den lagt op her.
Jeg skal foretage en søgning i en mange-til-mange relation, hvor den kun skal give mig de produkter, der er med i ALLE de grupper, jeg søger i...
Jeg har x antal grupper, som smides ned i noget dropdown værk... det fungerer fint nok, og giver mig en streng af gruppeid's, som produkterne skal være en del af. Fx.: ;3;7;9;10;
Disse gruppe id'er skal så tjekkes mod relationstabellen, og hvis et produkt er med i alle de forespurgte kriterier, så skal det returneres til brugeren.
Mine hidtige forsøg har gået på at opbygge en streng af produktids, som jeg senere kan bruge som et array til at returnere resultatet. Det går også fint nok i første gennemløb, men når den skal igang med kriterie nummer 2 og fremefter, så er det straks sværere, da den så skal pille de produkter ud af resultatstrengen, som IKKE matcher kriteriet ... argh!
det vil jo give alle de produkter, hvor bare 1 kriterie er mødt... jeg skal have et tjek på, jeg kun får produkter, der har tilknytning til grupperne 3,7,9,10
det får du jo også..... Det handler jo bare om at skrive din sql sætning ud fra det...
Lige nu splitter den jo str1 ud, så laver du jo bare et kald til basen where grpID = 7 og så selvfølgelig resten af dit basekald skal selvfølgelig også være i sætningen....
- men hvordan skal man kunne lave en sql sætning til en mange-til-mange relation i den sammenhæng... der er jeg ikke helt med på, hvad du mener... jeg kan ikke se andre muligheder end jeg også vil få returneret de records, hvor kun 1 kriterie er mødt.
ahh ... oki, så forstår jeg .. du skal lave en loop der bygger din SQL:
str1 = "3;7;9;10;" delt_ud = split(str1, ";")
SQL = "SELECT * FROM [dine joins] WHERE " if( UBOUND( delt_ud ) = 1 ) then SQL = SQL & " pg_product_group = " & delt_ud( 1 ) else for i = 1 To UBound( delt_ud ) SQL = SQL & "pg_product_group = " & delt_ud( i ) if( i < UBOUND( delt_ud ) ) SQL = SQL & " and " end if next end if
Hmmm... jeg kan altså ikke få dit eksempel til at give mening i mit tilfælde...
Tror måske, vi taler lidt forbi hinanden... Det tricky i det her system er altså, den her mange-til-mange relation. Hvis jeg gør, som dit script foreslår, så vil jeg jo fx. få en sætning, der ser således ud:
SELECT * FROM pg_product_group WHERE pg_groupid = 3 AND pg_groupid = 7
Det virker ikke, da relationen ligger linje for linje...
Altså: Hvis vi får følgende kriterier fra formen : 3,5,9 (som er vores groupid's)
Så skal den kigge i pg_product_group og der skal det se sådan ud:
_id _groupid _productid x 3 5 x 5 5 x 9 5
KUN hvis den finder alle 3 linjer i pg_product_group, så skal den returnere 5
Såvidt jeg kan se, så kan dit eksempel ikke det... ? (Correct me if I'm wrong)
ah ... så kan det være jeg forstår lidt bedre (endnu en gang ;-) )
det lyder som en underlig struktur, men det kunne måske lade sig gøre med følgende SQL:
SELECT p_product, count( * ) AS c FROM t_products INNER JOIN (t_groups INNER JOIN t_product_group ON t_groups.g_id = t_product_group.pg_groupid) ON t_products.p_id = t_product_group.pg_productid WHERE g_id IN(3,5,9) GROUP BY p_product
så er du nødt til å kigge dit resultat igennem og se på kolonnen 'c'. *hvis* denne kolonne indeholder det samme antal som UBOUND( delt_ud ) ( længden af din array med valgte grupper ), så skal du skrive ud produktet ...
jeg mener at det er din "skriv ud produkt *kun* hvis det er hits på alle grupper" som er lidt underlig. Jeg prøver at tænke på om det kunne gøres på en anden måde, men jeg kender jo hellere ikke dit system. Det er højst sandsynligt det bedste for dig at du går efter dét du har lavet, når du selv kender systemet :-)
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.