Autor Zpráva
Adam1999
Profil
Dobrý den,
Potřebuji z databáze vyčíst známky a nějak je zprůměrovat.
V databázi jsou uloženy takto:

To znamená že potřebuji vytáhnou všechny "reviews" a udělat z nic průměr.
K čtení z databáze používám následovné:
<?php
                $result = dibi::query('SELECT * FROM [reviews] WHERE [user_id] = %s, "11");
                  if ($all = $result->fetchAll())
                    foreach($all as $row) {
                      echo $row->reviews;
                    }
              ?>
Problém je v tom že nevím jak je od sud dostat a zprůměrovat protože takhle se mi zprůměruje každý řádek databáze zvlášť.
Prosím budu rád za každou pomoc :),
Děkuji.
lionel messi
Profil
Adam1999:
Mohla by ti pomôcť agregačná funkcia AVG().
Adam1999
Profil
Zkusím to ale nevím jak se s tou funkcí zachází rovnou mi vypíše průměr?
lionel messi
Profil
Adam1999:
ale nevím jak se s tou funkcí zachází rovnou mi vypíše průměr?
Presne tak, funkcia vráti priemer svojho argumentu (bližší popis nájdeš po kliknutí na odkaz v [#2]).
Adam1999
Profil
Dotaz jsem upravil takto
<?php
$result_r = dibi::query('SELECT AVG(reviews) AS "AverageReviews" FROM [users_reviews] WHERE [id] = %s', "11");
  if ($all_r = $result_r->fetchAll())
   foreach($all_r as $row_r) {
    $row_r->AverageReviews;
  }
?>
Bohužel nefunguje kde je chyba?
Děkuji.
tiso
Profil
pre začiatok: [id_user]
juriad
Profil
Adam1999:
V [#1] a v [#5] se dotazuješ jiných tabulek. Která je ta správná? Neznám syntaxi dibi, ale myslím, že alias v uvozovkách ti na MySQL neprojde; tam patří zpětné apostofy `AverageReviews`.
Alphard
Profil
juriad:
Neznám syntaxi dibi, ale myslím, že alias v uvozovkách ti na MySQL neprojde
V MySQL projde skoro cokoliv, i ty uvozovky :-)

A pokud jde o dibi, identifikátory patří do hranatých závorek, nebo zpětných uvozovek, pak jsou nahrazovány podle konkrétní databáze.
Adam1999
Profil
Upravil jsem to teda takto podle rad:
<?php
$result_r = dibi::query('SELECT AVG(reviews) AS [AverageReviews] FROM [users_reviews] WHERE [id_user] = %s', "11");
  if ($all_r = $result_r->fetchAll())
   foreach($all_r as $row_r) {
    $row_r->AverageReviews;
  }
?>
Bohužel to stále nic nedělá.
aDAm
Profil
a konkrétnější být nemůžeš?


PS: sic nejsem expert přes DB ale neměla by se u agregační funkce definovat i agregace?

mysql> SELECT student_name, AVG(test_score)
    ->        FROM student
    ->        GROUP BY student_name;
Adam1999
Profil
Ale já od sud nechci vyčíst "student_name" ale pouze ten průměr
aDAm
Profil
acho bože, to co sem tu vložil je z příkladu z uvedeného linku....Vidíš tam to GROUP BY ? To je to co ti tam chybí. Jinak pro tvou podmínku že to má být user s id 11 ti to vrátí jen jeden záznam takže to fetchAll je zbytečné a místo něj je vhodné něco jako fetchOne či tak nějak a pak samo je zbytečný i ten cyklus.
Kajman
Profil
aDAm:
Pokud se v select části uvádí jen agregační funkce a žádné sloupce, je dotaz v pořádku i bez group by klauzule a udělá se např. ten průměr pro všechny vyhovující řádky.

Adam1999:
Nechybí tam jenom echo na pátém řádku?
aDAm
Profil
No proto jsem uvedl ať je s popisem chyby trošku více sdílnější, ono je fajn říct "Nefunguje to"....na to pak lze odpovědět "Tak to máš rozbitý" ;)
adam1999
Profil *
Kajman:
Děkuji už to funguje :) Moje chyba to echo mi úplně vypadlo.

aDAm:
Děkuji že se srazíš pomoc ale pokud chceš být takto nepříjemný tak radši nepomáhej ušetří ti to nervy :).

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:

0