Avatar billede mailand Nybegynder
26. januar 2004 - 12:02 Der 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 tabeller ser således ud (forkortet):

t_groups:
g_id (autonumber)
g_group (text)

t_products:
p_id (autonumber)
p_product (text)

t_product_group:
pg_id (autonumber)
pg_groupid (number)
pg_productid (number)


Er det muligt at lave en sådan søgning ?

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!

Hints/idéer/hvad-som-helst modtages med glæde!

#Mailand
Avatar billede and_ Nybegynder
26. januar 2004 - 12:14 #1
str1 = "3;7;9;10;"
delt_ud = split(str1, ";")

i = 0

do while i =< Ubound(delt_ud)

Din base-udskrivning

loop

Dette kunne være en måde....
Avatar billede mailand Nybegynder
26. januar 2004 - 12:22 #2
narj...

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

#Mailand
Avatar billede and_ Nybegynder
26. januar 2004 - 12:41 #3
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....
Avatar billede mailand Nybegynder
26. januar 2004 - 12:54 #4
øhh... ja...

- 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.

#Mailand
Avatar billede nute Nybegynder
26. januar 2004 - 12:55 #5
eh ... du kan vel bruge IN operatoren. Hvis du gør om dine ; til , så burde det køre:

SELECT * FROM ... WHERE pg_productid IN ("3,7,9,10")

/nute
Avatar billede mailand Nybegynder
26. januar 2004 - 13:01 #6
ok... kender ikke lige IN operatoren, men vil den ikke medtage records, hvor kun 1 kriterie er mødt ?

fx. SELECT * FROM t_product_group WHERE pg_groupid IN("3,7,9,10")

Vil det ikke give mig fx. et product id, som bare optræder med én af ovenstående gruppeid'er?

... Hvis et produkt i denne sammenhæng skal matche kriterierne, så skal der jo være 1 record for hvert kriterie
Avatar billede nute Nybegynder
26. januar 2004 - 13:08 #7
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

/nute
Avatar billede mailand Nybegynder
26. januar 2004 - 14:43 #8
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)

Nå, håber, der er nogen, der har et bud...

#Mailand
Avatar billede nute Nybegynder
26. januar 2004 - 15:15 #9
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 ...

er jeg stadig galt på den ?

/nute
Avatar billede mailand Nybegynder
26. januar 2004 - 15:17 #10
jeg prøver den lige af...

underlig struktur... hmm... er der andre måder at lave det på, hvis relationen skal være mange-til-mange ?

#Mailand
Avatar billede nute Nybegynder
26. januar 2004 - 15:21 #11
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 :-)

/nute
Avatar billede mailand Nybegynder
26. januar 2004 - 15:23 #12
det er et kundekrav, så den del, kan jeg desværre ikke røre ved... men jeg ved snart heller ikke, hvad der skal ske... :(
Avatar billede nute Nybegynder
26. januar 2004 - 15:27 #13
nå ... men det kan da helt sikkert løses. alt kan løses bare man tænker i de baner der skal til ;-)

har du fået testet den sidste SQL jeg sendte ?

/nute
Avatar billede mailand Nybegynder
26. januar 2004 - 15:44 #14
det ser fisme ud som om, det virker.... !

tak tak! smid et svar!
Avatar billede nute Nybegynder
26. januar 2004 - 15:53 #15
ah ... fino :-)

selv tak ...

/nute
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