On Tue, 26 Oct 2004 20:04:34 +0200, "Jeppe Vesterbæk"
<jhve02_fjerndette_@control.auc.dk> wrote:
>Men hvad så hvis jeg kræver, at personen skal have relation til både gruppe
>3 og gruppe 4? Min løsning lige nu:
>SELECT p.* FROM
>(person p LEFT JOIN p_gr_r pg ON p.pID = pg.pID)
>LEFT JOIN p_gr_r pg2 ON p.oID = pg2.pID
>WHERE pg.gID =3 AND pg2.gID=4
>
>Det virker, men det er lidt bøvlet .. især fordi jeg kommer til at lave
>søgninger med relationer til over 10 grupper. Der må være en rigtigre måde
>at gøre dette på.
Muligvis kan tråden begyndende med dette indlæg hjælpe dig:
<news:cjiiqm$rko$1@katie.ellegaard.dk>
Eller via Google:
http://groups.google.com/groups?hl=da&lr=&c2coff=1&threadm=cjqag9%247ru%241%40katie.ellegaard.dk&rnum=2&prev=/groups%3Fq%3Dauthor:Brodersen%2Bgroup:dk.edb.database%26hl%3Dda%26lr%3D%26c2coff%3D1%26selm%3Dcjqag9%25247ru%25241%2540katie.ellegaard.dk%26rnum%3D2
Mit forslag:
SELECT p.*, COUNT(*) AS antal
FROM person p
INNER JOIN p_gr_r pg ON p.pID = pg.pID
WHERE pg.gID IN (3,4)
GROUP BY p.pID
HAVING antal = 2;
HAVING-antallet skal justeres efter antallet af grupper, personen skal
være med i. Så hvis personen skal tilhøre tre grupper - 2,4 og 5 - så
ser queryen således ud:
SELECT p.*, COUNT(*) AS antal
FROM person p
INNER JOIN p_gr_r pg ON p.pID = pg.pID
WHERE pg.gID IN (2,4,5)
GROUP BY p.pID
HAVING antal = 3;
I øvrigt, idet du alligevel bruger WHERE på pg og pg2 i dit eksempel,
er der ingen grund til at LEFT JOIN'e fremfor INNER JOIN'e.
(det er måske på sin plads at bemærke, at det ikke er yndigt at hive
felter ud, man ikke aggregerer på - i dette tilfælde ville jeg dog
gøre det uden at blinke, idet der er tale om præcis samme række, der
går igen flere gange, og der bruges MySQL)
--
- Peter Brodersen
Ugens sprogtip: pc (og ikke PC)