Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Neumím dotaz do databáze MySQL

Ahoj,
potřeboval bych pomoc s dotazem/výpisem.
V databázi je tabulka, která má sloupce kraj, cs, era, kb, ge, ra, uc. Jde o hodnocení bankovních poboček z pohledu osob se sluchovým postižením. Hodnotilo se v každém kraji 6 bank.
Rozepsat to po jednotlivých krajích snad zvládnu, ale neumím udělat "vše". Známkuje se jako ve škole a chtěl bych tabulku, kde by byl průměr známek ze všech krajů. Zatím jsem sesmolil

<!--vse-->
<table border="2" cellpadding="6" cellspacing="0" frame="vsides" rules="rows" style="border: 2px solid maroon">
<?php
$vysledekvse = mysql_query( 
"SELECT * FROM banky_bezbarierovost
);
//) or die(mysql_error());
/* Konec přímé práce s databází. */
?>
<br><br>
<tr>
<td><strong>Česká spořitelna a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam["cs"]; ?></td>
</tr>
</table>
<?php endwhile ?>
<!--/vse-->

Neumím to jednak nijak sečíst a vydělit 14 (14 krajů), druhak mi to vypisuje chybu špatná syntaxe i u tohoto obyč. výpisu (<?php echo $zaznam["cs"]; ?>) s jedním záznamem v tabulce.

Předmět Autor Datum
Zkus tohle Select kraj, Sum(cs) as SumCS, AVG(cs) as PrumCS, Sum(era) as SumERA, AVG(era) as PrumER…
Jan Fiala 16.09.2012 07:41
Jan Fiala
ako pisal Fiala, agregacna funkcia AVG s vyuzitim group by na pole kraj. V PHP kode vidim 2 chyby. z…
wam_Spider007 16.09.2012 10:26
wam_Spider007
Já jsem děsná trubka. Spatlal jsem to takto <!--vse--> <table border="2" cellpadding="6" cellspacin…
Kráťa 16.09.2012 11:45
Kráťa
Hoď tam jednoduchý uvozovky <td style="text-align: center"><?php echo $zaznam['cs']; ?></td>
Gizzer 16.09.2012 11:52
Gizzer
v tom selecte su stale zle uvodzovky. maju byt az za order by kraj. za AVG(uc) as PrumUC uz ciarka n…
wam_Spider007 16.09.2012 12:44
wam_Spider007
$vysledekvse = mysql_query( "Select kraj, Sum(cs) as SumCS, AVG(cs) as PrumCS, Sum(era) as SumERA, A…
hynajs 16.09.2012 12:56
hynajs
Díky moc, ještě mám dvacet minut, tak jsem to zkusil. Stránka se alespoň už načetla, ale ukazuje chy…
Kráťa 16.09.2012 13:09
Kráťa
$vysledekvse asi obsahuje hlášení o mysql chybě ( třeba neexistující sloupec apod.) Hlášení vypíšeš…
hynajs 16.09.2012 14:23
hynajs
Napadlo me v te souvislosti, jestli nemam blbe typ sloupce (mam varchar), jestli nema byt jiný (zkus…
krata-mobil 16.09.2012 15:33
krata-mobil
S tím výpisem chyby databáze napíše Parse error: syntax error, unexpected T_ECHO in /domains1/lt6223…
Kráťa 16.09.2012 22:25
Kráťa
A když jsem to "or" teď vyndal a doplnil tabulku i o dalších 5 bank a vložil do databáze údaje za 3…
Kráťa 16.09.2012 22:28
Kráťa
nerad sa opakujem, ale za PrumUC je ciarka navyse - uz som to pisal vyssie. Ale ked niekto cita sele…
wam_Spider007 16.09.2012 23:07
wam_Spider007
Jsem koukal a udělal to od Hynaise a na tebe zapomněl. V tom je můj největší problém. Kopíruji řádky…
Kráťa 16.09.2012 23:20
Kráťa
<table> jsem dal před select a už je jen jedna tabulka. Avšak místo známek se vypíšou další řádky ta…
Kráťa 16.09.2012 23:23
Kráťa
ten select ked pustis v mysql, tak co to vypluje? Nie som si teraz isty, ale ak je v nejakom riadku…
wam_Spider007 16.09.2012 23:36
wam_Spider007
Jsem to předělal, když jsem vyndal dvojtečku, udělala se chyba. U Raifeisen to dělá tu nulu, jak jsi…
Kráťa 17.09.2012 00:11
Kráťa
1. no zrejme je dvojbodka zaciatok cyklu a ten endwhile koniec. ja osobne preferuje pouzitie zatvori…
wam_Spider007 17.09.2012 00:18
wam_Spider007
Já to právě chci v jedné tabulce průměry ze všech krajů :-( Nakonec to úplně vyhodím, nechám jen kra…
Kráťa 17.09.2012 00:25
Kráťa
"A jak řekl, tak udělal." Vyhodil ten celostátní průměr a dá se na to i koukat. Až mi půjde udělat,…
Kráťa 17.09.2012 00:31
Kráťa
Takže jsem něčeho dosáhl. Žádné while, ale nadefinovat proměnnou. Jen nevím, proč je všude celé čísl…
Kráťa 17.09.2012 03:23
Kráťa
ten round by som nedaval do PHP, ale do SQL: Select kraj, Sum(cs) as SumCS, ROUND(AVG(cs), 1) as Pr…
wam_Spider007 17.09.2012 08:06
wam_Spider007
Jo, mám to jak jsem chtěl. Moc ti děkuji. Že to nepočítá na jedno desetinné místo ani když to je v s…
Kráťa 17.09.2012 10:48
Kráťa
Napadlo me v te souvislosti, jestli nemam blbe typ sloupce (mam varchar), jestli nema byt jiný (zkus…
ERASER 17.09.2012 12:52
ERASER
Ja myslel, ze TINYINT je take ciselny udaj. Od snad -128 do +128. Z formulare do db se odesilaji zna…
krata-mobil 17.09.2012 13:07
krata-mobil
wam_Spider007 má pravdu, teď jsem to také vyzkoušel, takže doma to zkoušet ani nemusíš. Takže Nevím…
ERASER 17.09.2012 13:56
ERASER
Kraje tam všechny nejsou, jsou tam zatím jen 4. Testeři to musí vyplnit aby to bylo v db. Jsou však…
Kráťa 17.09.2012 14:44
Kráťa
ja som to skusal a dal som AVG funkciu na pole typu INT a z cisel 2 a 3 mi vyplulo 2.500 takze je to…
wam_Spider007 17.09.2012 13:07
wam_Spider007
To jsem z toho jelen. Já dal všem INT a nic. Furt celá čísla.
Kráťa 17.09.2012 14:41
Kráťa
a ten round robis priamo v tom SQL prikaze ako som to napisal? ak ano tak je to divne ... Ak tak sku…
wam_Spider007 17.09.2012 16:57
wam_Spider007
Teď dám obrázky, aby byla změna :-) [http://pc.poradna.net/file/view/10892-kod-gif] [http://pc.por…
Kráťa 17.09.2012 18:07
Kráťa
ok, a ked len cisto v MySQL spustis ten SELECT, ktory je v PHP, tak ake hodnoty to vyhodi? Ak to vyh…
wam_Spider007 17.09.2012 19:34
wam_Spider007
Select přímo v phpmyadmin vyhodí tohle [77select_vysledky_tn.jpg] Koukám, že to snad ani nesčítá,…
Kráťa 17.09.2012 22:12
Kráťa
Export té tabulky, kdyby se tím někdo chtěl zabývat -- phpMyAdmin SQL Dump -- version 2.10.0.2 -- h…
Kráťa 17.09.2012 22:27
Kráťa
ach jaj my sme ale krepi :-D no necudo, ze to dava cele cisla, ked to grupujeme za kraj a ty mas v…
wam_Spider007 17.09.2012 22:54
wam_Spider007
Jo, z tohoto už lezou průměry jak jsem to původně chtěl. Děkuji ti za pomoc, já bych se s tím mořil… poslední
Kráťa 17.09.2012 23:21
Kráťa
Včera mě také napadlo, udělat si $delitel z počtu řádků v tabulce asi nějak $delitel = mysql_result(…
Kráťa 17.09.2012 18:36
Kráťa

ako pisal Fiala, agregacna funkcia AVG s vyuzitim group by na pole kraj.
V PHP kode vidim 2 chyby. za SELECT * FROM banky_bezbarierovost chyba uvodzovka "
A neviem ako si poradi PHP s hviezdickou v selecte. Radsej by som pouzil normalny vypis poli.

Já jsem děsná trubka. Spatlal jsem to takto

<!--vse-->
<table border="2" cellpadding="6" cellspacing="0" frame="vsides" rules="rows" style="border: 2px solid maroon">
<?php
$vysledekvse = mysql_query( 
"Select kraj, 
Sum(cs) as SumCS, AVG(cs) as PrumCS, 
Sum(era) as SumERA, AVG(era) as PrumERA, 
Sum(kb) as SumKB, AVG(kb) as PrumKB,
Sum(ge) as SumGE, AVG(ge) as PrumGE,
Sum(ra) as SumRA, AVG(ra) as PrumRA,
Sum(uc) as SumUC, AVG(uc) as PrumUC,
  from banky_bezbarierovost"
  group by kraj
  order by kraj
);
//) or die(mysql_error());
/* Konec přímé práce s databází. */
?>
<?php 
while ($zaznam = mysql_fetch_array ($vysledekvse)): ?>
<br><br>
<tr>
<td><strong>Česká spořitelna a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam["cs"]; ?></td>
</tr>
</table>
<?php endwhile ?>
<!--/vse-->

A vypisuje se pouze "Parse error: syntax error, unexpected T_STRING in /domains1/lt622300/public/www/banka-bez-barier/vyp is.php on line 22" To je tento řádek
<td style="text-align: center"><?php echo $zaznam["cs"]; ?></td>

Napište mi to někdo prosím celé dobře. Nemám dnes vůbec čas se to učit, zítra to potřebuji mít rozchozené, aby mi testeři vyplnili kraje a za chvilku jedu pryč a u stroje budu až večer. Dík 296x.

$vysledekvse = mysql_query( 
"Select kraj, 
Sum(cs) as SumCS, AVG(cs) as PrumCS, 
Sum(era) as SumERA, AVG(era) as PrumERA, 
Sum(kb) as SumKB, AVG(kb) as PrumKB,
Sum(ge) as SumGE, AVG(ge) as PrumGE,
Sum(ra) as SumRA, AVG(ra) as PrumRA,
Sum(uc) as SumUC, AVG(uc) as PrumUC,
  from banky_bezbarierovost
  group by kraj
  order by kraj"
);

Díky moc, ještě mám dvacet minut, tak jsem to zkusil. Stránka se alespoň už načetla, ale ukazuje chybu
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /domains1/lt622300/public/www/banka-bez-barier/vyp is.php on line 26
na tom řádku je
while ($zaznam = mysql_fetch_array ($vysledekvse)):

$vysledekvse asi obsahuje hlášení o mysql chybě ( třeba neexistující sloupec apod.)
Hlášení vypíšeš třeba takto :

$vysledekvse = mysql_query( 
"Select kraj, 
Sum(cs) as SumCS, AVG(cs) as PrumCS, 
Sum(era) as SumERA, AVG(era) as PrumERA, 
Sum(kb) as SumKB, AVG(kb) as PrumKB,
Sum(ge) as SumGE, AVG(ge) as PrumGE,
Sum(ra) as SumRA, AVG(ra) as PrumRA,
Sum(uc) as SumUC, AVG(uc) as PrumUC,
  from banky_bezbarierovost
  group by kraj
  order by kraj"
) or echo mysql_error ();




A když jsem to "or" teď vyndal a doplnil tabulku i o dalších 5 bank a vložil do databáze údaje za 3 kraje, "aby byl matroš", tak mi to vypsalo chybu:
"Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /domains1/lt622300/public/www/banka-bez-barier/vyp is.php on line 49"
na řádku 49 je
while ($zaznam = mysql_fetch_array ($vysledekvse)): ?>

<table> jsem dal před select a už je jen jedna tabulka. Avšak místo známek se vypíšou další řádky tabulky.

<!--vse-->
<table border="2" cellpadding="6" cellspacing="0" frame="vsides" rules="rows" style="border: 2px solid maroon">
<?php
$vysledekvse = mysql_query( 
"Select kraj, 
Sum(cs) as SumCS, AVG(cs) as PrumCS, 
Sum(era) as SumERA, AVG(era) as PrumERA, 
Sum(kb) as SumKB, AVG(kb) as PrumKB,
Sum(ge) as SumGE, AVG(ge) as PrumGE,
Sum(ra) as SumRA, AVG(ra) as PrumRA,
Sum(uc) as SumUC, AVG(uc) as PrumUC 
  from banky_bezbarierovost
  group by kraj
  order by kraj"
);


while ($zaznam = mysql_fetch_array ($vysledekvse)): ?>
<br><br>



<tr>
<td><strong>Česká spořitelna a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam['cs']; ?></td>
</tr>

<tr>
<td><strong>Era poštovní spořitelna a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam['era']; ?></td>
</tr>

<tr>
<td><strong>Ge Money Bank a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam['ge']; ?></td>
</tr>

<tr>
<td><strong>Komerční banka a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam['kb']; ?></td>
</tr>

<tr>
<td><strong>Raiffeisenbank a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam['ra']; ?></td>
</tr>

<tr>
<td><strong>UniCredit Bank Czech Republic a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam['uc']; ?></td>
</tr>
</table>
<?php endwhile ?>
<!--/vse-->

ten select ked pustis v mysql, tak co to vypluje?
Nie som si teraz isty, ale ak je v nejakom riadku daneho stlpca hodnota NULL a urobis nad nim AVG alebo SUM, tak vysledok je NULL. Takze tie AVG bude este treba osetrit AVG(COALESCE(nazov_stlpca, 0)).

a len tak btw: co je tam ta dvojbodka v prikaze

while ($zaznam = mysql_fetch_array ($vysledekvse)): ?>

aha uz viem v com je problem:
nedavaj echo $zaznam['cs']; ale echo $zaznam['PrumCS']; atd. lebo tie polia sa premenovali tym AVG(cs) AS PrumCS

1. no zrejme je dvojbodka zaciatok cyklu a ten endwhile koniec. ja osobne preferuje pouzitie zatvoriek {}
2. ok, da sa to aj tak poriasit, fixnou hodnotou
3. orezanie desatinnych ciarok treba spravit zaokruhlovanim. V SQL na to sluzi funkcia Round. Jej pouzitie je Round(hodnota, pocet_miest)
4. To vypisovanie riadkov je preto, lebo select vrati niekolko riadkov znamok, kedze je viacero krajov. Takze pre kazdy kraj sa vypisu hodnoty v urcenom tvare.

Takže jsem něčeho dosáhl. Žádné while, ale nadefinovat proměnnou. Jen nevím, proč je všude celé číslo, když to mám na jedno desetinné. Ale ono už je celé číslo v tom výsledku s nulami. Přijde mi to, že už je výsledek zaokrouhlen, jelikož CS má součet u čtyř řádků 9 a to by mělo být 2,2 a je tam 2.
dole vypis.php

<!--vse-->
<table border="2" cellpadding="6" cellspacing="0" frame="vsides" 
rules="rows" style="border: 2px solid maroon">
<?php
$vysledekvse = mysql_query( 
"Select kraj, 
Sum(cs) as SumCS, AVG(cs) as PrumCS, 
Sum(era) as SumERA, AVG(era) as PrumERA, 
Sum(kb) as SumKB, AVG(kb) as PrumKB,
Sum(ge) as SumGE, AVG(ge) as PrumGE,
Sum(ra) as SumRA, AVG(ra) as PrumRA,
Sum(uc) as SumUC, AVG(uc) as PrumUC 
  from banky_bezbarierovost
  group by kraj
  order by kraj"
);

$zaznam = mysql_fetch_array ($vysledekvse); ?>

<tr>
<td><strong>Česká spořitelna a. s.</strong></td>
<td style="text-align: center"><?php echo round($zaznam['PrumCS'],1); ?></td>
</tr>
...

ten round by som nedaval do PHP, ale do SQL:

Select kraj, 
Sum(cs) as SumCS, ROUND(AVG(cs), 1) as PrumCS, 
Sum(era) as SumERA, ROUND(AVG(era), 1) as PrumERA, 
Sum(kb) as SumKB, ROUND(AVG(kb), 1) as PrumKB,
Sum(ge) as SumGE, ROUND(AVG(ge), 1) as PrumGE,
Sum(ra) as SumRA, ROUND(AVG(ra), 1) as PrumRA,
Sum(uc) as SumUC, ROUND(AVG(uc), 1) as PrumUC 
  from banky_bezbarierovost
  group by kraj
  order by kraj

inak co sa ma dosiahnut tymi SUM(cs), SUM(era)? Pretoze to len scita vsetky znamky dokopy. Ak mas 3 riadky s hodnotami 3, 5, 1 tak vysledok bude 9. Predpokladam, ze tam malo ist COUNT - pocet riadkov/znamok.

Napadlo me v te souvislosti, jestli nemam blbe typ sloupce (mam varchar), jestli nema byt jiný (zkusím dát TINYINT). Doma vyzkousim.

Jaké datové typy mají dané údaje?
mysql
Podle mě by to měl být typ "4.3. Čísla s pohyblivou desetinou čárkou", například "FLOAT".

Podle mě když jsou v celočíselném tvaru a následně je s nimi provedena nějaká matematická operace, tak výsledek může být zase ve stejném tvaru (celočíselném).

wam_Spider007 má pravdu, teď jsem to také vyzkoušel, takže doma to zkoušet ani nemusíš. Takže Nevím proč ti to nepočítá správně :-(. Na tom webu taky asi nemáš zobrazeny všechny kraje, jelikož jsem počítal Ge a vyšlo mi 14/4=3,5 (suma/pocet_kraju) a na webu mas "2.0". Jinak TINYINT je také číselný údaj od -128 do +127, bez znaménka (UNSIGNED) 0 až 255, ale vždy celočíselný. Vycházel jsem na základě zkušností z jiných programovacích jazyků.

Export té tabulky, kdyby se tím někdo chtěl zabývat

-- phpMyAdmin SQL Dump
-- version 2.10.0.2
-- http://www.phpmyadmin.net
-- 
-- Počítač: localhost
-- Vygenerováno: Pondělí 17. září 2012, 22:24
-- Verze MySQL: 5.0.89
-- Verze PHP: 5.2.10

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

-- 
-- Databáze: `258468542db`
-- 

-- --------------------------------------------------------

-- 
-- Struktura tabulky `banky_bezbarierovost`
-- 

CREATE TABLE `banky_bezbarierovost` (
  `kraj` text character set cp1250 collate cp1250_czech_cs NOT NULL,
  `cs` decimal(2,1) NOT NULL,
  `era` decimal(2,1) NOT NULL,
  `ge` decimal(2,1) NOT NULL,
  `kb` decimal(2,1) NOT NULL,
  `ra` decimal(2,1) NOT NULL,
  `uc` decimal(2,1) NOT NULL,
  `klady` text character set cp1250 collate cp1250_czech_cs NOT NULL,
  `zapory` text character set cp1250 collate cp1250_czech_cs NOT NULL,
  `poznamka` text character set cp1250 collate cp1250_czech_cs NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin2 COLLATE=latin2_czech_cs;

-- 
-- Vypisuji data pro tabulku `banky_bezbarierovost`
-- 

INSERT INTO `banky_bezbarierovost` (`kraj`, `cs`, `era`, `ge`, `kb`, `ra`, `uc`, `klady`, `zapory`, `poznamka`) VALUES 
('Praha', 2.0, 1.0, 3.0, 5.0, 4.0, 4.0, 'Jednoznačně Era poštovní spořitelna, kde mají on-line přepis (eScribe) a pokud jej na pobočce nemají, velmi ochotné píší na monitoru.', 'Na žádost o napsání sdělení odpověděla klientská pracovnice v Komerční bance, že nemá čas.', 'Často nechybí vstřícnost, ale chybí znalost komunikace s osobou s postižením sluchu.'),
('Středočeský kraj', 3.0, 1.0, 4.0, 4.0, 3.0, 3.0, 'Bezproblémová a plnohodnotná komunikace v Era poštovní spořitelně', 'Psaní na malé papírky (ve dvou pobočkách  dokonce na jeden za celou dobu).', 'Psát na monitor, nebo alespoň na papír A4.'),
('Ústecký kraj', 2.0, 1.0, 5.0, 3.0, 3.0, 2.0, 'Ochota klientského pracovníka v UniCredit Bank Czech Republic a. s.', 'Odmítnutí napsat informaci v GE Money Bank a. s. a to dokonce po několikerém zopakování.', 'Chtělo by to nějaké školení pracovníků, jak komunikovat.'),
('Liberecký kraj', 2.0, 1.0, 2.0, 3.0, 3.0, 2.0, 'Potěšila mne nejvíce ERA poštovní spořitelna.\r<br>Dostala jsem se tam až v 16.55, na dveřích měli cedulku s otvírací dobou a bylo tam napsáno, že zavírají v 17:00. Ale přesto mě bez řečí hned vzali a věnovali se mi. Když jsem řekla, že neslyším, a zda by paní mohla použít užít eScribe, bez řečí je použila a bylo to skvělé. Úřednice se mi věnovala až do 17:15 a nikdo neremcal, že už mají zavřeno. Klobouk dolů! \r<br>I v ostatních bankách byli vstřícní a ochotně natočili monitor, na který mi po mé žádosti psali odpovědi, ale nejlepší byla ta ERA. ', 'Žádná nebyla hrozná. Akorát jsem musela v Komerční bance tu úřednici nějakou dobu přesvědčovat, aby mi nepsala na papír (na čemž ona zpočátku opakovaně trvala), nýbrž že chci, aby ke mně natočila monitor a psala mi. Po chvíli ale souhlasila a už to šlo dobře, také mi ukázala, jak funguje internetbanking na jejich webové stránce. ', 'Zavést možnost eScribe ve všech bankách.');

ach jaj my sme ale krepi :-D

no necudo, ze to dava cele cisla, ked to grupujeme za kraj a ty mas v kazdom kraji len jeden riadok. Takze to urobi priemer vzdy za jeden kraj.
To, ze je celkovy priemer za CS 2,25 je sice pekne, ale toto dostaneme len ak spravime priemer za vsetky kraje (2+2+2+3)/4. My ale robime priemer pre kazdy kraj zvlast. Cize musel by si mat viacero riadkov pre Prahu, viacero pre Stredocesky kraj etc.

Takze asi bude treba urobit select:

SELECT AVG(CS) AS PrumCS, AVG(era) AS PrumERA, ... FROM banky_bezbarierovost;

Jo, z tohoto už lezou průměry jak jsem to původně chtěl.
Děkuji ti za pomoc, já bych se s tím mořil měsíc. :-) Značím za vyřešené.
Až někdo nude chtít průměry ze sloupců, b udeme ho sem odkazovat. Konečný select + to další je takto

<?php
$vysledekvse = mysql_query( 
"SELECT ROUND(AVG(CS), 1) as PrumCS, 
ROUND(AVG(era), 1) as PrumERA, 
ROUND(AVG(kb), 1) as PrumKB,
ROUND(AVG(ge), 1) as PrumGE,
ROUND(AVG(ra), 1) as PrumRA,
ROUND(AVG(uc), 1) as PrumUC
FROM banky_bezbarierovost"
);


$zaznam = mysql_fetch_array ($vysledekvse); ?>

<tr>
<td><strong>Česká spořitelna a. s.</strong></td>
<td style="text-align: center"><?php echo $zaznam['PrumCS']; ?></td>

vypis.php

Zpět do poradny Odpovědět na původní otázku Nahoru