Autor Zpráva
Vasek42
Profil *
Dobrý den, mám skript, který počítá kolik příspěvek obsahuje celkem hvězdiček, z jiné tabulky v databázi.
mám celkem dvě tabulky
prispevky = zde jsou napsaný příspěvky
ratings = zde mám hodnocení

Tento kod mi počítá kolik má příspěvek hodnocení(hvězdiček)
  $total = 0;
    $rows = 0;
$sel = mysql_query("SELECT rating_num FROM ratings WHERE rating_id = 'pris_".$row["id"]."'");
while ($data = MySQL_Fetch_Array($sel)) {
    $total = $total + $data['rating_num'];
        $rows++;
}
$perc = ($total/$rows);

celý skript

$result = mysql_query("select * from prispevky ORDER BY datum DESC LIMIT 7");

 while ($row = MySQL_Fetch_Array($result)) {
 $text = htmlspecialchars_decode($row["text"]);
//hodnocení počet 
  $total = 0;
    $rows = 0;
$sel = mysql_query("SELECT rating_num FROM ratings WHERE rating_id = 'pris_".$row["id"]."'");
while ($data = MySQL_Fetch_Array($sel)) {
    $total = $total + $data['rating_num'];
        $rows++;
}
$perc = ($total/$rows);
//konec hodnocení
 

echo "<div class=\"prispevek_nadpis\">".$row["nadpis"]."</div>";

echo"</div>";
}

Jak nyní udělám, aby se příspěvky seřadily od nejlepšího hodnocení po nejhorší?
Děkuji mnohokrát
juriad
Profil
Složeným dotazem, vrátí příspěvky i hodnocení najednou (takto se to vždy v praxi dělá, nepokládá se další dotaz na jednotlivá hodnocení):
SELECT p.*, r.prumer
FROM prispevky p
LEFT JOIN (SELECT rating_id, AVG(rating_num) prumer
  FROM ratings
  GROUP BY rating_id
) r ON r.rating_id = CONCAT('pris_', p.id)
ORDER BY prumer DESC
LIMIT 7
Silně doporučuji změnit rating_id v tabulce ratings, aby přímo odpovídaly id příspěvku (změní se v dotazu zvýrazněná část). Jinak bude ten dotaz pomalý (zhruba stejně pomalý, jako to máš řešené teď).

Je-li ti na tom dotazu něco nejasného, zeptej se.
Vasek42
Profil *
juriad:
Super děkuji moc, zdá se, že funguje parádně.

Mám více hodnocení: příspěvky, foto, uživatelé.. tudýž mám v rating_id předpony pris_, foto_, uziv_
juriad
Profil
Tak přidej nový sloupec typ hodnocení a v podmínce na řádce 6 budeš mít:
ON r.rating_id = p.id AND r.rating_type = 'pris'
Toto je mnohem lepší řešení, protože stejný problém budeš nejspíš mít i při počítání hodnocení jiných typů.


První normální forma říká, že každý sloupec má obsahovat dále nedělitnou informaci. Žádné spojení informace o typu a id hodnoceného objektu.
Jak bys vytvořil dotaz na průměrné hodnocení každého typu zvlášť? Chceš zjistit, zda uživatelé hodnotí fotky výrazně jinak než příspěvky.
Vasek42
Profil *
dobrá, změním to, ještě jednou díky.
Vasek42
Profil *
Dobrý večer, tak změněno, ještě bych potřeboval u jednoho hodnocení jestli by nešlo vypsat pouze 3tí výsledek.
Tzv zase, aby se to řadilo, ale vypsal se jen záznam na 3 místě.
peta
Profil
LIMIT 3,1 ?
Kajman
Profil
peta:
Opět radíš chybně!

Aby se vypsal třetí řádek, je potřeba 2 přeskočit a jeden vypsat.

limit 2, 1

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: