Martin Mouritzen wrote:
> Simpelt set:
> Jeg har 2 tabeller. tags og tags2ting. Tags har bare kolonnerne id og
> name, og tags2ting har "tagid,tingid" som kolonner.
>
> I queriet herunder, hiver jeg tingid ud, hvis der er ét af tagsne der
> matcher. Jeg vil gerne modificere det så det kun hiver ud hvis alle
> tags matcher.
>
> SELECT
> tags2ting.tingid
> FROM
> tags2ting,
> tags
> WHERE
> (
> tags.name = 'tag1'
> OR
> tags.name = 'tag2'
> )
> AND
> tags.id = tags2ting.tagid
>
>
> Altså, så hvis jeg i kolonnen tags har
>> id | name |
>> 1 | tag1 |
>> 2 | tag2 |
>
> og i kolonnen tags2ting har
>
>> tagid | tingid |
>> 1 | 1 |
>> 1 | 2 |
>> 2 | 2 |
>
> Så skal kun tingid 2 hives ud.
>
> Jeg tænker at det er et ret nemt problem, jeg syntes bare ikke lige at
> jeg kan finde løsningen.
Det er ikke et nemt problem, hvis det skal løses i standard-sql - hvilket
jeg er nødt til, når du ikke fortæller, hvilket system du bruger.
"Alle" er noget bøvl i sql. Spørgsmålet kan omskrives til:
"Find alle ting i tags2ting, hvor der ikke findes tags, der ikke findes i
tags2ting."
På SQL:
select * from tags2ting tt1
where not exists
(select * from tags t1
where not exists
(select * from tags2ting tt2
where t1.tagid = t2.tagid
and tt1.tingid = tt2.tingid))
Nogle systemer har en ALL-operatorer, andre implementerer relation division.
Begge funktioner giver mulighed for simplere løsninger.
--
Venlig hilsen /Best regards
Kristian Damm Jensen