PudolfMedlem sedan juli 2000221 inlägg Hej jag har ett litet problem, det är så att jag listar alla produkter från en tabell, sen har jag en annan tabell där omdömen om produkten läggs in, så jag tar bl a fram medelvärdet (siffror) och skulle vilja sortera efter dem, men lyckas inte! Så här ser min kod ut just nu:
$sql = "SELECT * FROM produkter ORDER BY titel ASC";
$sql_result = mysql_query($sql,$conn)
or die("Database Error.");
while ($row = mysql_fetch_array($sql_result)) {
$produkt_id = $row["id"];
$result2 = mysql_query("SELECT totalbetyg/antalroster AS genomsnitt FROM produkter WHERE id = $id",$conn);
$svar = mysql_fetch_array($result2);
$genomsnitt = $svar['genomsnitt'];
$result3 = mysql_query("SELECT COUNT(pid) AS antalomdomen FROM omdomen WHERE pid = $id",$conn);
$svar2 = mysql_fetch_array($result3);
$antalomdomen = $svar2['antalomdomen'];
$result4 = mysql_query("SELECT AVG(omdomen) AS omdomen FROM omdomen WHERE pid = $id",$conn);
$svar3 = mysql_fetch_array($result4);
$medelvarde = $svar3['omdomen'];
$produkt_titel = $row["titel"];
$produkt_typ = $row["typ"];
$skriv_ut .= "<a href='id=$produkt_id'>$produkt_titel ($produkt_typ) ($genomsnitt) ($antalomdomen : $medelvarde)</a><br>";
}
echo "$skriv_ut";
Med den här koden skrivs allt ut rätt och det sorteras efter titel (asc), men jag skulle vilja att det sorterades efter $medelvarde istället. Har testade en hel del med "JOIN" som ja blev tipsad om men fattar inte hur sql-satsen ska se ut! Om någon kunde "JOIN:a" frågan vore det kanon!
Tack på förhand! :)
LarsGMedlem sedan dec. 200012 464 inlägg select avg(totalbetyg/antalroster) as avgBetyg,
COUNT(*) AS antalomdomen,
AVG(omdomen) AS omdomen ,
produkter.id
FROM omdomen , produkter
WHERE omdomen.pid = produkter.id
group by produkter.id
order by omdomen desc
Du kan ju testa ut frågan interaktivt först, sedan är det bara lägga in den i skriptet och loopa på.
PudolfMedlem sedan juli 2000221 inlägg Tack det funkade!
Två små följdfrågor bara :)
1. Din sql-sats ser ut att vara rejält mycket snabbare än min, är det så?
2. Just nu hämtas och visas bara de postar som har fått omdömen i tabellen omdomen, de produkt_id'n som inte finns med i tabell omdomen skrivs alltså inte ut, går detta att fixa? Så att alla produkter från tabell produkter skrivs ut, även om de inte finns med i tabell omdomen. Då skulle jag vilja att deras omdöme var 0.
EDIT:
3. Försökte med en till sak, att bara ta ut de som hade COUNT(*) AS antalomdomen högre än 10, alltså som hade fler än 10 omdömen i tabellen omdomen.
select avg(totalbetyg/antalroster) as avgBetyg,
COUNT(*) AS antalomdomen,
AVG(omdomen) AS omdomen ,
produkter.id
FROM omdomen , produkter
WHERE omdomen.pid = produkter.id
[red]AND COUNT(*) > 10[/red]
group by produkter.id
order by omdomen desc
Testade oxo med AND antalomdomen > 10 men jag får Error ändå. Vad gör jag fel :o
Tack på förhand! :)
aasahMedlem sedan mars 20034 471 inlägg
Pudolf skrev:
Tack det funkade!
Två små följdfrågor bara :)
1. Din sql-sats ser ut att vara rejält mycket snabbare än min, är det så?
2. Just nu hämtas och visas bara de postar som har fått omdömen i tabellen omdomen, de produkt_id'n som inte finns med i tabell omdomen skrivs alltså inte ut, går detta att fixa? Så att alla produkter från tabell produkter skrivs ut, även om de inte finns med i tabell omdomen. Då skulle jag vilja att deras omdöme var 0.
EDIT:
3. Försökte med en till sak, att bara ta ut de som hade COUNT(*) AS antalomdomen högre än 10, alltså som hade fler än 10 omdömen i tabellen omdomen.
select avg(totalbetyg/antalroster) as avgBetyg,
COUNT(*) AS antalomdomen,
AVG(omdomen) AS omdomen ,
produkter.id
FROM omdomen , produkter
WHERE omdomen.pid = produkter.id
[red]AND COUNT(*) > 10[/red]
group by produkter.id
order by omdomen desc
Testade oxo med AND antalomdomen > 10 men jag får Error ändå. Vad gör jag fel :o
Tack på förhand! :)
-
Enklaste fixen är väl att i databasen lägga in defaultvärdet 0 istället för null? I) Du kan kolla om det finns ett omdöme med 0 när du lägger in ett riktigt omdöme och i så fall plocka bort det, därefter sätta in det du har. II) Eller så ser du till att medelvärdet bara räknas över omdömen > 0 så räknas inte dummyvärdena med.
-
Jämförelser med aggregerande funktioner, såna som räknar, kan aldrig göras i where-klausulen. Använd having.
select avg(totalbetyg/antalroster) as avgBetyg,
COUNT(*) AS antalomdomen,
AVG(omdomen) AS omdomen ,
produkter.id
FROM omdomen , produkter
[red]WHERE omdomen.pid = produkter.id
group by produkter.id
having COUNT(*) > 10[/red]
order by omdomen desc