|
| 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
| |
|
|