/ 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
Select med join
Fra : MKJ


Dato : 30-10-06 16:24

Hej



Jeg har 2 tabeller, Dokumenter og Emneord. Et dokument kan have et eller
flere emneord tilknyttet. Hvordan kan jeg lave en søgning der finder alle
dokumenter der har både emneord1 og emneord2 tilknyttet? Jeg ved det er
muligt at joine den samme tabel flere gange men det vil jeg helst ikke da
jeg skal opbygge select sætningen dynamisk.

Jeg tror det er noget med en subselect og noget IN.



--

MKJ


 
 
Henrik Davidsen (30-10-2006)
Kommentar
Fra : Henrik Davidsen


Dato : 30-10-06 18:06

> Jeg har 2 tabeller, Dokumenter og Emneord. Et dokument kan have et eller
> flere emneord tilknyttet. Hvordan kan jeg lave en søgning der finder alle
> dokumenter der har både emneord1 og emneord2 tilknyttet? Jeg ved det er
> muligt at joine den samme tabel flere gange men det vil jeg helst ikke da
> jeg skal opbygge select sætningen dynamisk.
>
> Jeg tror det er noget med en subselect og noget IN.


Når du har lavet din join, har du jo alle kolonner fra begge tabeller til
rådighed, og så kan du vel bare tilføje en where klausul, som spørger om:
WHERE emneord = 'ord1' AND emneord = 'ord1'

under antagelse af, at kolonnen med emneordene rent faktisk hedder
"emneord".

/Sjang



MKJ (31-10-2006)
Kommentar
Fra : MKJ


Dato : 31-10-06 09:38

> Når du har lavet din join, har du jo alle kolonner fra begge tabeller til
> rådighed, og så kan du vel bare tilføje en where klausul, som spørger om:
> WHERE emneord = 'ord1' AND emneord = 'ord1'
>
> under antagelse af, at kolonnen med emneordene rent faktisk hedder
> "emneord".
>
> /Sjang
>

Det returnere ikke noget, så skal jeg bruge OR istedet for AND, det kan bare
give forkerte resultater.

--
MKJ


Henrik Davidsen (31-10-2006)
Kommentar
Fra : Henrik Davidsen


Dato : 31-10-06 18:37


> Det returnere ikke noget, så skal jeg bruge OR istedet for AND, det kan
> bare
> give forkerte resultater.

Kunne det ikke tænkes at der ikke er nogle dokumenter, der har begge emneord
tilknyttet?

/Sjang



Jens Gyldenkærne Cla~ (31-10-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 31-10-06 13:53

MKJ skrev:

> Jeg har 2 tabeller, Dokumenter og Emneord.

Hvilken database?

> Et dokument kan have et eller flere emneord tilknyttet.
> Hvordan kan jeg lave en søgning der finder alle dokumenter der
> har både emneord1 og emneord2 tilknyttet?

Med EXISTS (hvis databasen understøtter det):

SELECT *
FROM Dokumenter d
WHERE EXISTS (
   SELECT 1
   FROM Emneord
   WHERE dokID = d.dokID
   AND ord = 'hest'
   )
AND EXISTS (
   SELECT 1
   FROM Emneord
   WHERE dokID = d.dokID
   AND ord = 'hund'
   )

Det samme kan også laves med IN:


SELECT *
FROM Dokumenter
WHERE dokID IN (
   SELECT dokID
   FROM Emneord
   WHERE ord = 'hest'
   )
AND dokID IN (
   SELECT dokID
   FROM Emneord
   WHERE ord = 'hund'
   )


Hvis du har mange søgeord, kan det blive en tung affære med så
mange subselects. Et alternativ kan være at joine med en
forespørgsel der finder de ønskede id'er via GROUP BY (forudsætter
at et emneord kun kan tilknyttes det samme dokument 1 gang):

SELECT *
FROM Dokumenter d
WHERE dokID IN (
   SELECT dokID
   FROM Emneord
   WHERE ord IN ('hest', 'hund')
   GROUP BY dokID
   HAVING COUNT(*) = 2
   )


Samme med EXISTS:

SELECT *
FROM Dokumenter d
WHERE EXISTS (
   SELECT 1
   FROM Emneord
   WHERE dokID = d.dokID        
   AND ord IN ('hest', 'hund')
   GROUP BY dokID
   HAVING COUNT(*) = 2
   )
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

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

Månedens bedste
Årets bedste
Sidste års bedste