Autor Zpráva
Manny
Profil *
Ahojte, dlouho jsem se na nic neptal, takže:-)
Pomocí tohoto kódu:
$prumernehodnoceni = $celkovehodnoceni/$pocethodnoceni;
	$prumer = Round($prumernehodnoceni,2);

počítám průměrnou známku na 2 desetiná čísla, kterou bych rád uložil do databáze. A v tom je problém.
Ačkoli jsem sloupec v databázi zkoušel nastavit na typ float, double nebo decimal, zapisuje se mi to vždy jen ve tvaru 0.20, 0.30. Nikdy ne třeba 2.35 apod.
Kde je problém?
Alphard
Profil
Trocha teorie je na MySQL (7) - hrátky s čísly - Linux Software
Zkuste třeba float(5,2), nevím ale, jaká je maximální známka.
Já bych ale asi zaokrouhloval a asi i počítal až při výpisu. Máte to promyšlené? Při každém novém hlasování přičítejte známku, inkrementujte počet hodnocení a při výpisu vypočítejte průměr.
Manny
Profil *
Alphard:
Ano, přesně tak to dělám. Při každém hlasování přičítám známku a zvyšuji o jednu počet hodnocení. I průměr jsem chtěl počítat až při výpisu, ale to mi nějak nejde. Tak jsem v databázi vytvořil další sloupec, do kterého bych rovnou zapisoval průměr (i ohledem pro pozdější snažší výpis nejlepších hodnocení).
Alphard
Profil
Manny:
I průměr jsem chtěl počítat až při výpisu, ale to mi nějak nejde.
select if(pocet>0, round(celkem/pocet, 2), null) prumer from tabulka
Manny
Profil *
Alphard:
Jenže já tímhle vypisuji v podstatě celý řádek
while ($zaznam=MySQL_Fetch_Array($vysledek))
  echo '<div class="polozky"><a href="komiksy/'.$zaznam["poradi"].'/komiks.php" target="_blank" ><img src="komiksy/'.$zaznam["poradi"].'/thumb.jpg"></a>'.'<h3>'.$zaznam["nazev"].'</h3><h4>'.$zaznam["popis"].'</h4><h5>Autor:&nbsp;'.$zaznam["autor"].'&nbsp;|&nbsp;Překlad:&nbsp;'.$zaznam["preklad"].'&nbsp;|&nbsp;Vloženo:&nbsp;'.$zaznam["vlozeno"].'&nbsp;|&nbsp;Známka:&nbsp;'.$zaznam["znamka"].'</h5></div>';
?>
:
Manny
Profil *
A ještě jsem chtěl dodat, že před tímto cyklem jsem zkoušel nastavit ten průměr a to mi právě nešlo.
Alphard
Profil
[#5]
To by nemělo vadit, průměr bude prostě další sloupec, tj. $zaznam['prumer']
Manny
Profil *
Alphard:
Proto jsem chtěl ten průměr dostat už do databáze a pak ho jen vypsat tímhle polem.
Alphard
Profil
Manny:
Proto jsem chtěl ten průměr dostat už do databáze a pak ho jen vypsat tímhle polem.
Vy mě pořád nechápete. Nemusí existoval sloupec průměr, lze ho simulovat tím výpočtem.

Ale rozhodně vám nechci vnucovat své řešení, jenom jste neposkytl potřebné informace pro řešení vašeho problému, co jsem k tomu mohl napsat, jsem napsal už v [#2].
Manny
Profil *
Alphard:
Aha, tak to se omlouvám. Už mi to nějak nemyslí:-)
Ten float jsem zkusil s parametry 3,2, protože známka bude od 1 do 5 na 2 desetinná čísla, ale nefunguje to. Pořád to ukládá jen 0.30 a tak. Pro dnešek toho asi nechám. Zatím díky.
Manny
Profil *
Ze zoufalství začátečníka sem dávám celý script, kterým stránkuju a vypisuju databázi a prosím Alpharda nebo někoho jiného, jak tam přidat [#4], tak aby mi to na konci vypisovalo průměr na 1 desetinné číslo ze sloupců pojmenovaných v db celkovaznamka a počethlasovani.
<?php
  define ("ROWS", 12);
 
$id_spojeni=mysql_connect('localhost','root','');
if (!$id_spojeni)
	die ('Nezdařilo se spojení!');

$vysledek=mysql_select_db('inverso',$id_spojeni);
if (!$vysledek)
	die ('Připojení se nepovedlo!');
	
  mysql_query("SET NAMES 'utf8'");
if (!isset($_GET["celkem"])) //pokud nevíme, kolik bude záznamů tak to zjistíme... 
  {
    $vysledek=mysql_query("select count(*) as pocet from komiksy");
    $zaznam=mysql_fetch_array($vysledek);
	
    $celkem=$zaznam["pocet"];
		
  }
else
  {
    $celkem=$_GET["celkem"];
  }
  
 ?>
 <div class="stranky">
 <?php
if ($celkem>ROWS) 
  {
    if (!isset($_GET["od"])) $od=1;
	else $od=$_GET["od"]; 
    $vysledek=mysql_query("select * from komiksy ORDER BY poradi DESC"." limit ".($od-1).", ".ROWS);
        echo "Zobrazené komiksy: ".$od."-";
		echo (($od+ROWS-1)<=$celkem)?($od+ROWS-1):$celkem;
		echo " z celkem $celkem&nbsp;&nbsp;&nbsp;";
      //začátek - vytvoř odkaz pouze pokud nejsme na začátku
		if ($od==1) echo "&nbsp;&nbsp;&nbsp;&nbsp;Začátek&nbsp;|&nbsp;"; 
		else echo "&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=1&amp;str=".$str."\">Začátek</a>&nbsp;|&nbsp;";
      //zpět - vytvoř odkaz pouze pokud nejsme v prvních ROWS
		if ($od<ROWS) echo "Předchozí&nbsp;|&nbsp;"; 
		else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od-ROWS)."&amp;str=".$str."\">Předchozí</a>&nbsp;|&nbsp;";
    //další - vytvoř, pouze pokud nejsme v posledních ROWS
		if ($od+ROWS>$celkem) echo "Další&nbsp;|&nbsp;"; 
		else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od+ROWS)."&amp;str=".$str."\">Další</a>&nbsp;|&nbsp;";
    //poslední - to je posledních (zbytek po dělení ROWS) záznamů
		if ($od>$celkem-ROWS) echo "Konec&nbsp;<BR>"; 
		else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."&amp;str=".$str."\">Konec</a><BR>";
  }
 ?>
 </div>
 <?php  
  while ($zaznam=MySQL_Fetch_Array($vysledek))
  echo '<div class="polozky"><a href="komiksy/'.$zaznam["poradi"].'/komiks.php" target="_blank" ><img src="komiksy/'.$zaznam["poradi"].'/thumb.jpg"></a>'.'<h3>'.$zaznam["nazev"].'</h3><h4>'.$zaznam["popis"].'</h4><h5>Autor:&nbsp;'.$zaznam["autor"].'&nbsp;|&nbsp;Překlad:&nbsp;'.$zaznam["preklad"].'&nbsp;|&nbsp;Vloženo:&nbsp;'.$zaznam["vlozeno"].'&nbsp;|&nbsp;Známka:&nbsp;'.$zaznam["znamka"].'</h5></div>';
?>
AM_
Profil
$vysledek=mysql_query("SELECT poradi, nazev, popis, autor, preklad, vlozeno, if(pocet>0, round(celkem/pocet, 2), null) AS znamka FROM komiksy ORDER BY poradi DESC"." limit ".($od-1).", ".ROWS);


ještě poznamenám, že sloupec známka (to je ten průměr?) nemusí existovat (dokonce ani nemá žádný smysl, aby existoval). Ukládat jej do databáze není dobrý postup, jedno dělení není operace, jejíž výsledek by stálo za to cachovat, proto je to plýtvání velikostí DB.
Alphard
Profil
$vysledek=mysql_query("select *, if(pocethlasovani>0, round(celkovaznamka/pocethlasovani, 1), 'nehodnoceno') znamka from komiksy ORDER BY poradi DESC"." limit ".($od-1).", ".ROWS);

Teď vidím, že AM byl rychlejší. Tak ještě druhá verze, kde zachovávám *, ale lepší je sloupce vyjmenovat.

AM:
Manny chce nakonec jedno desetinné číslo.
Manny
Profil *
Alphard, AM:
Děkuju vám oběma, pánové. Hned to jdu vyzkoušet. Nenapadlo mě, že tu konstrukci můžu celou napsat do dotazu do db. Začal jsem s php a mysql nedávno a tohle je první pokus něco udělat. Nakonec jsem si taky uvědomil, že mi stačí jen jedno desetinné místo (hodnocení po půlkách).
Přeju bouřlivého silvestra a do nového roku spoustu trpělivosti s takovými, jako já:-)
Manny
Profil *
Tenhle script mě stojí víc sil než jsem myslel.
Chtěl jsem ještě pole $zaznam["známka"] převést na obyčejnou proměnnou $známka a pak podle hodnot udělat podmínky a vypisovat grafické hodnocení. Ale ať ten převod proměnné strčím do cyklu nebo ven, nejede to.
Je tohle v pořádku a kam s tím?
$znamka = $zaznam["znamka"];
if ($znamka <= 1  ){$hodnoceni= "./img/45star.gif";}
if ($znamka <= 0.5){$hodnoceni = "./img/5star.gif";}
atd.

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: