Avatar billede mbagge Nybegynder
16. oktober 2007 - 11:36 Der er 13 kommentarer og
1 løsning

Select med flere kriterier

Hej eksperter..

Jeg har lidt problemer med et select statement der skal returnere rows hvor flere kriterier er opfyldt.

Tabellen er ganskel simpel:
ID;MedlemsID;InteresseID

Samme medlem optræder altså flere gange hvis flere interesser er valgt.

Jeg ønsker nu at kunne definere fx 3 interesser og få en liste over de medlemmer som har valgt alle 3 interesser (der må gerne være valgt flere, men de 3 specificerede skal alle være valgt)

Nogle ideer?
Avatar billede nielle Nybegynder
16. oktober 2007 - 11:46 #1
Sådan

SELECT medlemsID FROPM dinTabel WHERE InteresseID = 7 OR InteresseID = 9 OR InteresseID = 13
Avatar billede mbagge Nybegynder
16. oktober 2007 - 11:57 #2
Det er desværre ikke så simpelt. Ovenstående returnere alle medlemmer som har angivet blot en eller flere af de specificerede interesser.
Jeg skal kun have dem der har alle 3 interesser (eller flere)
Avatar billede nielle Nybegynder
16. oktober 2007 - 12:00 #3
Så sådan?

(SELECT medlemsID FROPM dinTabel WHERE InteresseID = 7)
UNION
(SELECT medlemsID FROPM dinTabel WHERE InteresseID = 9)
UNION
(SELECT medlemsID FROPM dinTabel WHERE InteresseID = 13)
Avatar billede nielle Nybegynder
16. oktober 2007 - 12:00 #4
... eller?

SELECT medlemsID FROPM dinTabel WHERE InteresseID IN (7, 9, 13)
Avatar billede nielle Nybegynder
16. oktober 2007 - 12:01 #5
Jeg vrøvler ...
Avatar billede nielle Nybegynder
16. oktober 2007 - 12:04 #6
SELECT medlemsID
FROM dinTabel
WHERE
medlemsID IN (SELECT medlemsID FROM dinTabel WHERE InteresseID = 7)
AND
medlemsID IN (SELECT medlemsID FROM dinTabel WHERE InteresseID = 9)
AND
medlemsID IN (SELECT medlemsID FROM dinTabel WHERE InteresseID = 13)
Avatar billede mbagge Nybegynder
16. oktober 2007 - 12:29 #7
Mjoo...løsningen returnere de ønskede rækker, men der i praksis ubrugelig, da det er en meget tung forespørgsel.

Tabellen indeholder pt 60.000 rækker, og vil på sigt indeholde +500.000.

Et opslag med ovenstående løsning tager over 2 minutter og nedlæger samtidigt alt andet brug af databasen :)

Jeg tænker på om man måske kunne vidreudvikle på denne:



Ideer er at select medlemsid, count(medlemsid) as antal from tabel where
Avatar billede mbagge Nybegynder
16. oktober 2007 - 12:31 #8
hov...der kom lige en entertast i vejen...

Jeg tænker på om man måske kunne vidreudvikle på denne:

select medlemsid, count(medlemsid) as antal from medlemmer_interesser where interesseID in (40,41,42) group by medlemsid

Antal indeholder jo nu hvor mange interesser det enkelte medlem opfylder.
Men jeg kan ikke umiddelbart flytte det ned som en del af where sætningen.
(Altså where count(medlemsid) = 3)

Men måske der er et trick til dette?
Avatar billede nielle Nybegynder
16. oktober 2007 - 12:34 #9
Et det 3 sepcifikke interesset - eller blot 3 eller flere interesser?
Avatar billede nielle Nybegynder
16. oktober 2007 - 12:35 #10
Er det 3 specifikke interesser - eller blot 3 eller flere interesser?
Avatar billede mbagge Nybegynder
16. oktober 2007 - 12:41 #11
Det vil variere...

Nogle gange kan det være intresse 3,5 og 8. Andre gange 12 og 24. Og atter andre 1,3,4,6,7,13,21,45 osv osv.

Og som sagt skal der kun hentes de medlemmer som opfylder alle specificerede interesser
Avatar billede nielle Nybegynder
16. oktober 2007 - 12:47 #12
Måske:

SELECT medlemsID, count(*) AS antal
FROM medlemmer_interesser
WHERE interesseID IN (7,9,13)
GROUP BY medlemsID
HAVING antal = 3
Avatar billede mbagge Nybegynder
16. oktober 2007 - 12:58 #13
Perfekt....
Det var lige præcis 'having' jeg manglede

Mange tak for hjælpen...smid et svar
Avatar billede nielle Nybegynder
16. oktober 2007 - 13:09 #14
Svar :^)
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
Computerworld tilbyder specialiserede kurser i database-management

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