/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Opfyld alle betingelser ved et join
Fra : Martin Mouritzen


Dato : 15-05-07 12:37

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.
--
Med venlig hilsen,
Martin Mouritzen.
http://www.siteloom.dk

 
 
Kristian Damm Jensen (15-05-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 15-05-07 16:28

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



Morten (18-05-2007)
Kommentar
Fra : Morten


Dato : 18-05-07 18:24


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.

Et skud:

SELECT tingid, COUNT(*) AS taggings
FROM (SELECT tags2ting.tingid AS tingid
FROM tags2ting, tags
WHERE tags.name IN ('tag1', 'tag2')
AND tags.id = tags2ting.tagid) AS foo
GROUP BY tingid HAVING taggings = 2

Den vil være ret let at implementere i dit kaldende programmeringssprog
så du sender et array af tags, og indsætter dem i "IN" parantesen, og
arrayets længde i "HAVING" clausen.

Kan sikkert optimeres væsentligt.

Morten


Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste