Hej! Borde det inte räcka med något liknande(Förenklar tabeller och fältnamn) Det här är en klassisk sökningsfråga, som jag har svarat på några gånger i forumet. Det finns i huvudsak två sätt att lösa det. Antingen med mängdoperationer; Hej Niklas! Nej, den första varianten är inte gjord för att vara snabb, däremot är den helt generell (klarar godtyckliga AND, OR och parenteser) och egentligen ganska snygg.Hur man hämtar ut delmängd av en delmängd av en delmängd
Vi har en tabell med uppåt 20.000 poster som jag kallar "Tab1". Det finns en relationstabell "Tab1InTab2" till en tabell med kategorier "Tab2". Denna innehåller ca 10 poster. När vi ställer frågan mot databasen vill vi hämta ut alla poster i Tab1 som har ett antal kategorier. jag vill hämta ut endast de poster som är knutna till kategori1 OCH kategori2 OCH kategori3. Dvs, jag hämtar ut en delmängd som jag vill hämta ut en delmängd av som jag i sin tur vill hämta ut en delmängd av.
Frågan blir något i stil med
Select * From Tab1
JOIN Tab1InTab2 ON Tab1.intTab1ID=Tab1InTab2.intTab1ID
JOIN Tab2 ON Tab1InTab2.intTab2ID = Tab2.intTab2ID
WHERE Tab2.intTab2ID=[ID1] AND Tab1.intTab1ID IN (SELECT Tab1InTab2.intTab1ID FROM Tab1InTab2 WHERE Tab1InTab2.intTab2ID = Tab2.intTab2ID AND Tab2.intTab2ID=[ID2] AND Tab1InTab2.intTab1ID IN (SELECT Tab1InTab2.intTab1ID FROM Tab1InTab2 WHERE Tab1InTab2.intTab2ID = Tab2.intTab2ID AND Tab2.intTab2ID=[ID3] ))
Problemet är att frågan inte blir särskilt effektiv. Det tar ca en halv sekund att få ut svaret vilket känns sådär på en ny 64 bitars quadprocessor
Någon som har ett bättre och effektivare sätt att skriva dessa?
//RichardSv: Hur man hämtar ut delmängd av en delmängd av en delmängd
<code>SELECT * FROM Tab1
INNER JOIN Tab1InTab2 ON Tab1.tab1id = Tab1InTab2.tab1id
INNER JOIN Tab1InTab2 ON Tab1InTab2.tab2id = Tab2.tab2id
WHERE Tab2.tab2id IN ('id1', 'id2', 'id3')
</code>
EDIT:
Var nog inte så enkelt kom jag på...Sv: Hur man hämtar ut delmängd av en delmängd av en delmängd
Antag att du vill ha tab2 = 3, 4, 7. Då får du:
(SELECT Tab1ID FROM Tab1InTab2 WHERE Tab2 = 3)
INTERSECT
(SELECT Tab1ID FROM Tab1InTab2 WHERE Tab2 = 4)
INTERSECT
(SELECT Tab1ID FROM Tab1InTab2 WHERE Tab2 = 7)
Eller med count, det funkar bara om det alltid är _alla_ enskilda val.
SELECT Tab1ID FROM Tab1InTab2 WHERE Tab2 = IN(3,4,7) GROUP BY Tab1ID HAVING COUNT(Tab1ID)=3Sv:Hur man hämtar ut delmängd av en delmängd av en delmängd
Det verkar fungera men dock är den inte snabbare än den jag redan hade. Jag har doc inte prövat med count-exempletSv: Hur man hämtar ut delmängd av en delmängd av en delmängd
Count-varianten kan dock mycket väl vara snabbare.