Börjar undra ifall det här ens är möjligt. Antag att du har de valda böckerna i en tabell SelectedBooks och i denna tabell har du även en viktningsfaktor som säger hur mycket strength skall ökas för respektive bok. Tack! Jag testade sqlsatsen du skrev och det verkar fungera utmärkt nu efter en del modifikationer! Såg nu att man kan skapa temporära tabeller utan risk för konflikter.Väldigt svår SQLsats
Har 2 tabeller:
Books
BookID
BookName
Relations
BookId1
BookId2
Strength
Tabellen Relations innehåller referenser till tabellen book (BookId1/2) och strength anger hur mycket de har gemensamt (siffra, 0-10).
Nu är det så att användaren ska kunna bestämma 5 böcker i prioritetsordning och få upp en lista med de mest liknande böckerna (stark relation). Första boken som anges ska också ha större inflytande än de andra och sista boken ska ha lägst inflyande.
Om jag selectade dem en och en skulle det se ut ungefär såhär:
<code>
select b.BookName from Books b
INNER JOIN Relations r ON r.BookId1 = b.BookId OR r.BookId2 = b.BookId
ORDER BY Strength ASC
</code>
Är inte säker på ifall man kan använda OR i en join, har aldrig testat men det behövs något åt det hållet eftersom jag inte vet ifall det matchande IDt ligger i BookId1 eller BookId2, kan dock endast ligga i en av dem.
Men det riktiga problemet är att få med alla 5 sökningarna i en och samma lista. Order by måste justeras till något i stil med
ORDER BY (Strength*1.5) ASC - för första boken som angavs
ORDER BY (Strength*1.4) ASC - för andra boken som angavs
osv...
Så hur ska jag lösa detta? Projektet är bara på planeringsstadiet så det är fullt möjligt att komma med förslag på ändringar i databasstrukturen ifall det behövs.
Jag hoppas att jag lyckats göra mig förstådd.Sv: Väldigt svår SQLsats
BookId Factor
1 1.5
2 1.4
...
Om du då gör så här:
SELECT r.BookId1 AS BookId, r.Strength*s.Factor AS RelativeStrength
FROM SelectedBooks s ON Relations r ON r.BookId2 = s.BookId
UNION ALL
SELECT r.Book2Id AS BookId, r.Strength*s.Factor AS RelativeStrength
FROM SelectedBooks s ON Relations r ON r.BookId1 = s.BookId
Så får du en lista med alla relaterade böcker och deras vikt (vissa kommer med flera gånger).
Sen är det bara att sortera och välja hur många du vill ha typ
SELECT TOP 10 Distinct(BookId)
FROM (uttycket ovan)
ORDER BY RelativeStrength DESCSv:Väldigt svår SQLsats
Det jag funderar på nu är tabellen med faktorer, den måste ju skrivas om varje gång en sökning görs så hur gör man det här bäst?
1. Lägg till en kolumn, SearchID
BookId Factor SearchID
1 1.5 5
2 1.4 5
....
2. Skapa en temporär tabell för varje sökning
3. Cleara tabellen och lägg in de nya värdena vid varje sökning.
Eller något annat? Hur brukar man lösa sånt här?Sv: Väldigt svår SQLsats
Tack för all hjälp Martin :)