FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Nykomling
|
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! |
|||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Medlem
|
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 |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Nykomling
|
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...
|
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Flitig postare
|
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. |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
Citat:
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) |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Flitig postare
|
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 |
||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Nykomling
|
Tackar! Funkar klockrent!
|
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Supermoderator
|
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.
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Flitig postare
|
Vet om IN, fast jag knackar inte SQL så ofta så jag kan det på mina fem fingrar..
![]() |
||
![]() |
![]() |
Svara |
|
|