WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Behöver hjälp med en SQL-fråga (https://www.wn.se/forum/showthread.php?t=1039348)

Z@cke 2009-11-29 20:25

Behöver hjälp med en SQL-fråga
 
Hej,
Jag behöver hjälp med en SQL-fråga som jag inte får till. Håller på med en bild-databas till båt-klubben där varje bild kan taggas upp med ett eller flera nyckelord.

Tabell 1, "tblBilder", har info om själva bilden:
intBildID, strFilNamn

Tabell 2, "tblNyckelord", innehåller nyckelorden
intNoID, strNyckelord

Tabell 3, "tblLinkerBilderNyckelord", innehåller länkning mellan bilderna och nyckelorden
intBildID, intNoID

Om jag nu vill kunna filtrera sökträffarna så att endast de bilder visas som har koppling till SAMTLIGA nyckelord man valt i sin sökning visas, dvs inte bara något av nyckelorden, hur sjutton ser den frågan ut? Indata till frågan är alltså ett eller flera "intNoID".

Hoppas någon som är mer haj på SQL än jag kan hjälpa mig med detta... Tack på förhand!

Ristorasto 2009-11-29 21:25

Kanske såhär
 
SELECT b.* FROM tblBilder b INNER JOIN tblLinkerBilderNyckelord lbn ON b.inBildID = lbn.intBildID
WHERE
lbn.intNoID = 1 AND
lbn.intNoID = 2 AND
lbn.intNoID = 3 AND
lbn.intNoID = 4 AND
lbn.intNoID = 5
GROUP BY b.intBildID

Eller något sånt

Z@cke 2009-11-29 22:29

Tack, men den lösningen funkade tyvärr inte. Så fort jag har fler än ett intNoID i den sökningen får jag inga träffar alls, trots att det borde det enligt den data som finns i tabellerna...

Onkelborg 2009-11-29 23:29

Har nog inget färdigt förslag på lösning, men att sql-satsen ovan inte fungerar på att det är helt omöjligt att en och samma rad kan ha både värdena 1, 2, 3, 4 och 5 på samma kolumn.. :)

Rent teoretiskt, det du borde göra är att ha nästlade select-satser, den innersta något i stil med:

select count(intNoId), intBildId as intBildIdCurrent as cintNoId from tblLinkerBilderNyckelord where intNoId = 1 or intNoId = 2 or intNoID = 3 osv. osv. group by intBildId

Den andra nästlade:

select count(intNoId) as cintNoIdAll from tblLinkerBilderNyckelord where intBildId = intBildIdCurrent

Den yttersta:

select * from tblBilder [nästlad sql osv.] where cIntNoId = cintNoIdAll

Sen hur det ska klistras ihop har jag ingen koll på.. Men, men.

allstars 2009-11-30 08:30

Citat:

Ursprungligen postat av Z@cke (Inlägg 20333335)
Hej,
Jag behöver hjälp med en SQL-fråga som jag inte får till. Håller på med en bild-databas till båt-klubben där varje bild kan taggas upp med ett eller flera nyckelord.

Tabell 1, "tblBilder", har info om själva bilden:
intBildID, strFilNamn

Tabell 2, "tblNyckelord", innehåller nyckelorden
intNoID, strNyckelord

Tabell 3, "tblLinkerBilderNyckelord", innehåller länkning mellan bilderna och nyckelorden
intBildID, intNoID

Om jag nu vill kunna filtrera sökträffarna så att endast de bilder visas som har koppling till SAMTLIGA nyckelord man valt i sin sökning visas, dvs inte bara något av nyckelorden, hur sjutton ser den frågan ut? Indata till frågan är alltså ett eller flera "intNoID".

Hoppas någon som är mer haj på SQL än jag kan hjälpa mig med detta... Tack på förhand!


Något sådant!?
Kod:

SELECT b.* FROM tblBilder b INNER JOIN tblLinkerBilderNyckelord lbn ON b.inBildID = lbn.intBildID
WHERE
lbn.intNoID IN (SELECT intNoID FROM tblNyckelord GROUP BY intNoID)


Bjorne 2009-11-30 09:29

Typ såhär kanske:
Kod:

SELECT intBildID
FROM tblLinkerBilderNyckelord
WHERE intNoID IN (10, 20, 30, 40)
GROUP BY intBildID
HAVING COUNT(1) = 4
ORDER BY intBildID

4 = antalet nyckelord som du söker efter.

Z@cke 2009-12-02 20:14

Tackar! Funkar klockrent!

tartareandesire 2009-12-03 06:38

Just IN är något som alla borde lära sig när de börjar med SQL. Har sett otaliga exempel på långa OR-rabblingar som inte ser så snygga ut :)

Tänk dock på att detta är en ganska tung förfrågan så har du mycket trafik och en stor databas får du se upp lite. I ditt fall är det självfallet ingen fara.

Onkelborg 2009-12-05 19:34

Vet om IN, fast jag knackar inte SQL så ofta så jag kan det på mina fem fingrar.. :)


Alla tider är GMT +2. Klockan är nu 01:29.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson