Det jeg gerne vil er at selecte de rækker hvor f.eks. bruger_id 1 og 2 er med i, men hvor der kun er de to medlemmer, altså skal den ikke returnere grupperne 2 og 3, men kun gruppe 1.
Jeg lavede for test en tabel jannick med dine data, og så strikkede jeg denne query sammen der gav resultatet
gruppe_id bruger_id 1 2 1 2
SELECT gruppe_id, bruger_id FROM jannick WHERE bruger_id IN (1, 2) AND gruppe_id IN(SELECT gruppe_id FROM(SELECT gruppe_id, COUNT(*) count FROM jannick GROUP BY gruppe_id HAVING count=2) AS a);
Hvor det ønskede resultat ville være: (Gerne bare gruppere efter gruppe_id, så den bare returnerer gruppe_id = 1) --------------------------------- | gruppe_id | bruger_id | --------------------------------- | 1 | 1 | | 1 | 2 | ---------------------------------
Din query, kloge, var derimod lidt mere præcis, men returnerede desværre også uhensigtsmæssige rækker hvis jeg f.eks. ændrede querien til at skulle finde gruppen hvor bruger_id 2 og 3 er med i:
SELECT DISTINCT gruppe_id, MAX(bruger_id) FROM table GROUP BY gruppe_id HAVING COUNT(*) = 2 AND MAX(bruger_id) IN (2,3)
SELECT t1.gruppe_id,t1.bruger_id FROM (t t1 JOIN t t2 ON t2.gruppe_id=t1.gruppe_id) LEFT JOIN t t3 ON t3.gruppe_id=t1.gruppe_id AND t3.bruger_id<>t1.bruger_id AND t3.bruger_id<>t2.bruger_id WHERE t3.bruger_id IS NULL AND t1.bruger_id IN (1,2) AND t2.bruger_id IN (1,2);
SELECT t1.gruppe_id,t1.bruger_id FROM (t t1 JOIN t t2 ON t2.gruppe_id=t1.gruppe_id) LEFT JOIN t t3 ON t3.gruppe_id=t1.gruppe_id AND t3.bruger_id<>t1.bruger_id AND t3.bruger_id<>t2.bruger_id WHERE t3.bruger_id IS NULL AND t1.bruger_id IN (2,3) AND t2.bruger_id IN (2,3);
Ja, jeg indser problemet - min query giver resultater hvor der er præcist to rækker med en gruppe id og i disse tilfælde de rækker hvor bruger id er 1 eller 2. Ved nærlæsning af spørgsmålet ser jeg, at du kun vil have de rækker med hvor de eneste brugere i en gruppe er 1 og 2.
Men eftersom du nu har en egen løsning (og til lykke med det) skal jeg ikke bakse videre med min. Jeg afventer så at spørgsmålet lukkes (sandsynligvis med point til dig selv.)
Tak for forsøget, og det var da heller ikke forgæves, da din samt kloge's forslag bidrog til min egen query så i får lov at dele de 200 point, evt. også med arne, men afventer lige hans respons på nedenstående.
Arne ->
Nej, desværre, eftersom jeg fik bikset min egen løsning sammen inden du postede dit forslag, men da du jo bruger IN to gange tænker jeg at det vel ikke kan være bedre, performance mæssigt, end min egen løsning?
I mit tilfælde handler det mere om performance, end hvorvidt det er hurtigt at kode, og din query ville jo blive en del længere hvis nu jeg f.eks. vil finde gruppe_id ud fra eks. 6 bruger_id's.
Jeg har lige testet paa min PC med 1 million raekker og index paa begge felter.
Test paa moment tager ca. 400 gange saa lang tid som brug af join.
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.