06. april 2005 - 13:34Der er
12 kommentarer og 1 løsning
Mange-til-mange-relationer, igen igen.
Hej Eksperter
Jeg har orienteret mig lidt i de tidligere indlæg ang. mange-til-mange-relationer, men synes ikke, jeg kan finde et svar.
Jeg anvender følgende tabeller: - varer - kategorier - varer_kategorier (indeholder varer_ref og kategorier_ref)
En vare kan indgå i mange kategorier, og en kategori kan have mange varer.
I den webshop, der er tale om, skal man kunne søge på et ubestemt antal kategorier, som vinges af. Det kunne fx være "Puder", "Jul" og "Rød". Denne søgning skulle gerne vise alle de varer, som er tilknyttet minimum alle disse tre kategorier - altså røde julepuder.
PROBLEM: Jeg har problemer med at foretage denne søgning, da jeg kun ved, hvordan jeg finder alle de varer, som er tilknyttet én af kategorierne. Dette kunne fx gøres ved
SELECT * FROM varer_kategorier WHERE Kategorier_ref IN ('Puder','Jul', 'Rød')
Her anvender jeg naturligvis kategoriernes Id'er i stedet for navnene. Denne søgning vil give alt for mange resultater, idet en vare, som kun er tilknyttet "Jul" også vil komme med.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Hm, man kunne jo joine med varer_kategorier tre gange - en gang for hver kategori - men det kan næppe være den smarteste metode. Hvis ingen kommer med et bedre forslag, skal jeg da gerne stykke et sql-script sammen til dig.
Jeg er i tvivl om, hvordan jeg laver disse joins. Desuden kunne det lige så vel være, at der blev søgt på fem kategorier - men det kunne man vel bare genere dynamisk. Du må meget gerne skrive, hvordan jeg kan joine varer_kategorier tre gange - så kan jeg se, om jeg kan skræddersy det.
SELECT v.* FROM varer AS v INNER JOIN varer_kategorier AS v1 ON v.id = v1.varer_ref AND v1.kategorier_ref = 'jul' INNER JOIN varer_kategorier AS v2 ON v.id = v2.varer_ref AND v2.kategorier_ref = 'rød' INNER JOIN varer_kategorier AS v3 ON v.id = v3.varer_ref AND v3.kategorier_ref = 'puder'
Men optimalt ser det jo ikke ud :)
Dog er det vel også sjældent, at man laver en AND-søgning på tværs af kategorier - eller hvad? :)
Jeg kan ikke umiddelbart anvende eksemplet, da jeg ikke helt forstår v.* og de følgende v'er. Skulle dette give mig et dataset over de varer, som indgår i de tre kategorier?
Du har været til stor hjælp. Jeg har nu fået det til at virke, så jeg er glad. Er det ikke noget med, at du skal give et "Svar" før jeg kan give dig point.
Jeg tror ikke, der er en nemmere mulighed, men det er muligt, at nogen andre kommer og siger, at jeg er en stor fed løgner - og så tager jeg det så i mig.
Bare lige for at være lidt nasty så vil jeg lige nævne at man kan lave en normal "OR" søgning, GROUP BY varenr, og så HAVING COUNT(1) = <antal_af_kategorier_man_søger_i>, men det er mega nasty...
SELECT v.* FROM varer AS v INNER JOIN varer_kategorier AS v1 ON v.id = v1.varer_ref AND v1.kategorier_ref IN ('jul','rød','puder') GROUP BY v1.id HAVING COUNT(DISTINCT v1.kategorier_ref)) = 3
Men jeg tvivler på, at det performer meget bedre :D
shubijam: Gide du ikke køre en explain på begge og poste resultatet her?
Synes godt om
Ny brugerNybegynder
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.