webForumDet fria alternativet

Betygssnitt och produktinformation i samma hämtning

Databaser & SQL

11 svar · 593 visningar · startad av Grillcliff

Medlem sedan sep. 200032 inlägg
Frågan#1

Hej,

Går detta att klumpa ihop på något vis i en SQL-sträng.

Tabellen "product_ratings" innehåller:
"PID" (samma som products.id) och "rating" (int)

Önskat resultat: Ta ut all information från tabellen products för ID = Request.QueryString("ID"), hämta alla rader i "product_ratings" som har PID = Request.QueryString("ID"), räkna ihop resultatet med sum() och dela med antalet rader.

Förenklat, få ut snittbetyg och all produktinformation i en SQL-sträng :)

Mvh,

Medlem sedan dec. 200012 464 inlägg
#2
select p.id, p.name, avg(cast(pr.rating as decimal(10,2))) as rate
from products p join product_ratings pr
on p.id = pr.pid 
group by p.id,p.name
Medlem sedan sep. 200032 inlägg
#3

Tack för mycket snabbt svar!

Syntax error (missing operator) in query expression 'avg(cast(pr.ratings as decimal(10,2)))'.

Jag testade att på egen hand sätta in QueryStringen i strängen, men får det inte att funka. Funkar funktionerna du använder dig av i Access, vilket jag använder mig av just nu? Borde kanske ha nämnt det.

strSQL = "select p.id, p.name, avg(cast(pr.ratings as decimal(10,2))) as rate from products p WHERE p.id = " & Request.QueryString("id") & " join product_ratings pr on p.id = pr.pid group by p.id,p.name"
Medlem sedan dec. 200012 464 inlägg
#4

Jaha du använder Access du.

select p.id, p.name, avg(pr.rating + 0.0) as rate
from products p inner join product_ratings pr
on p.id = pr.pid 
group by p.id,p.name
Medlem sedan sep. 200032 inlägg
#5

Jajamen, det funkade kalas. Två problem kvarstår / uppkom dock ;)

Jag vill ha ut p.price och p.description, men tar jag med det i strängen klagar den på att jag vill executa en sträng med fält som inte är med i bla bla bla nånting, att fälten jag vill hämta är "onödiga".

Därtill måste Request.QueryString("ID") in någonstans. Nu plockar den samtliga betyg i tabellen, men den skall bara plocka betyg med product_ratings.PID = Request.QueryString("ID"). Resultatet presenteras på ex. default.asp?id=5.

Gick det att tyda? ;)

Edit: You tried to execute a query that does not include the specified expression 'price' as part of an aggregate function
Löstes(?) genom "GROUP BY p.id, p.product, p.price, p.description" - det blir inte segt då?

Medlem sedan dec. 200012 464 inlägg
#6

Om du lägger till flera kolumner i select-listan så måste de också vara med i group by.

sql = "select p.id, p.name, p.price, p.description, " & _
" avg(pr.rating + 0.0) as rate " & _ 
" from products p inner join product_ratings pr " &
" where p.id = " & request.querystring("ID")  & _
" on p.id = pr.pid " & _
" group by p.id,p.name,p.price, p.description "
Medlem sedan sep. 200032 inlägg
#7

Hoppas du förstår att jag uppskattar din hjälp, även om det inte vill sig riktigt :/

Nu kopierade jag in ditt ovanstående inlägg rakt av, så när som på att "name" byttes mot "product" samt att jag la dit ett "_" där jag antar att det saknas i ditt exempel.

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & path2database 
Set RecSet = Server.CreateObject("ADODB.Recordset")

strsql = "select p.id, p.product, p.price, p.description, " & _
" avg(pr.rating + 0.0) as rate " & _ 
" from products p inner join product_ratings pr " &
" where p.id = " & request.querystring("ID")  & _
" on p.id = pr.pid " & _
" group by p.id,p.product,p.price, p.description "

RecSet.Open strSQL, Connect, 1, 3

Jag får:

Error Type:
Syntax error in FROM clause.

:)

Edit: Ett byte till

" where p.id = '1' & _

ger Unterminated string constant.

Medlem sedan dec. 200012 464 inlägg
#8

Det kom lite i fel ordning

strsql = "select p.id, p.product, p.price, p.description, " & _
" avg(pr.rating + 0.0) as rate " & _ 
" from products p inner join product_ratings pr " & _
" on p.id = pr.pid " & _
" where p.id = " & request.querystring("ID")  & _
" group by p.id,p.product,p.price, p.description "
Medlem sedan sep. 200032 inlägg
#9

Så tokigt :) Det funkar dock kalasbra nu... nästan :birp

Vågar jag mig på ännu en fråga? ;)

Problemet är att om det inte finns några röster på en product plockar den inte ut något alls, inte pris, produktnamn, beskrivning eller något. Bästa hade givetvis varit att den i så fall sa ifrån att produkten inte har några röster (och sätter rate till 0.0) och att man får ut all annan information som vanligt.

Du skall ha en stor eloge för att du orkar med alla jobbiga problem, jag har snokat en del i forumet innan :)

Medlem sedan dec. 200012 464 inlägg
#10
strsql = "select p.id, p.product, p.price, p.description, " & _
" avg(iif(pr.rating is null,0,pr.rating) + 0.0) as rate " & _ 
" from products p left outer join product_ratings pr " & _
" on p.id = pr.pid " & _
" where p.id = " & request.querystring("ID")  & _
" group by p.id,p.product,p.price, p.description "
Medlem sedan sep. 200032 inlägg
#11

Nu blev jag glad, tack så mycket och ha en fortsatt trevlig kväll!

Resultatet kan skådas här: Produkt med betyg, Produkt utan betyg. Det är enbart dummyprodukter, är tänkt att bli ett e-handelssystem.

Over and out :)

Medlem sedan sep. 200032 inlägg
#12

En liten följdfråga.

Den skriver bara ut 255 tecken av produktbeskrivningen, även då fältet i databasen är av typen PM och innehåller betydligt mycket mer information. Kan man lösa detta på något smidigt sätt?

Exempel

269 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)