Autor Zpráva
skeletonek
Profil *
Zdravím, chtěl bych prosím poradit, jak můžu udělat tabulku, ve které se mi budou počítat automaticky body a tak samo bude se to srovnávat podle největšího bodu? Tabulku mám udělanou v databázi. Chci to zde na webu. http://beskydskaliga.info/vysledky.php Děkují všem za radu.
Jan Tvrdík
Profil
skeletonek:
Tabulku mám udělanou v databázi.
Co třeba ukázat, jak ta tabulka v DB vypadá?
skeletonek
Profil *
CREATE TABLE IF NOT EXISTS `muzi` (
  `id` int(10) NOT NULL auto_increment,
  `poradi` varchar(10) default NULL,
  `druzstvo` varchar(20) default NULL,
  `jedna` varchar(10) default NULL,
  `dva` varchar(10) default NULL,
  `tri` varchar(10) default NULL,
  `ctyri` varchar(10) default NULL,
  `pet` varchar(10) default NULL,
  `sest` varchar(10) default NULL,
  `sedm` varchar(10) default NULL,
  `osm` varchar(10) default NULL,
  `devet` varchar(10) default NULL,
  `deset` varchar(10) default NULL,
  `jedenact` varchar(10) default NULL,
  `dvanact` varchar(10) default NULL,
  `trinact` varchar(10) default NULL,
  `ctrnact` varchar(10) default NULL,
  `patnact` varchar(10) default NULL,
  `celkem` varchar(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;


doplňují "drustvo" to je název sboru,
"poradi" dycky musím měnit podle toho jak mi vyjdou body
"celkem" to je prázdné to tam nemá byt
a jednotlivé buňky "jedna","dva","tri".... tam vyplnují body, kolik ten sbor během te soutěže získal a potom se mi to ve sloupci CELKEM sečte, ale chci, aby se mi to srovnávalo samo podle největšího čísla, čili pořadí
Jan Tvrdík
Profil
skeletonek:
Jedná se o špatný  návrh.

Co chceš vlastně do tabulky ukládat?
skeletonek
Profil *
chci ukládat názvy sboru a jednotlivé body soutěží
chci aby se mi automaticky počítaly celkové body a chci aby se řadilo pořadí, rovněž automaticky s tím, že 1 místo má nejvíce bodů
LaMMa
Profil *
co maju byt tie nazvy jedna az patnact?
skeletonek
Profil *
jednotlivé buňky pro zápis bodů ze soutěže. Každé číslo je přiřazené k datumu soutěže, kde budou body družstev. Fakt nevím jak víc to napsat.
final
Profil *
prečo tam nenecháš len stĺpec bodyCelkovo?a vždy k tomu len pripočítavať body
skeletonek
Profil *
jojo ten celkovy tam nemá být to tam je prázdné nepoužívám ho. PRakticky se mi ty kódy sčítají

<?php  $bar = $zaznam["jedna"]+$zaznam["dva"]+$zaznam["tri"]+$zaznam["ctyri"]+$zaznam["pet"]+$zaznam["sest"]+$zaznam["sedm"]+$zaznam["osm"]+$zaznam["devet"]+$zaznam["deset"]+$zaznam["jedenact"]+$zaznam["dvanact"]+$zaznam["trinact"]+$zaznam["ctrnact"];
                                       $bar = "$bar";
                                       echo $bar;?>

a pro dolování z DB mám tento script

 $vysledek=mysql_query("select * from muzi");
LaMMa
Profil
navrh db teda nic moc, ale ked uz chces takto, tak tam nechaj aj ten celkovy a updatuj ho vzdy pri pridani nejakych bodov tymu.

potom select na vyber od najviac bodov po najmenej:

SELECT * FROM `muzi` ORDER BY `celkem` DESC;
skeletonek
Profil *
Ale to jsem si moc nepomohl, protože se mi to bude řadit stejně jako když budu zadávat pořadí... Jenom budu složitěji zapisovat a počítat celkové body a to já nechci, já chci aby se mi to automaticky sčítalo a zároveň automaticky řadilo podle nejvyššího počtu bodu.


jo sorry měl jsem ten příkaz jinak udělaný a sice místo

$vysledek=mysql_query("select * from muzi");
SELECT * FROM `muzi` ORDER BY `poradi` DESC;



a takto to nechci
Someone
Profil
skeletonek:
V tom případě si tu databázi navrhni lépe.
viz.: [#4] Jan Tvrdík
skeletonek
Profil *
Dobrá, ale jak potom ten select mám udělat? když ji navrhnu lépe?
Kajman
Profil
Pak jednoduše použijte k součtu agregační funkci sum.
select id_zavodnika, sum(body) celkem
from   tabulka_s_body
group  by id_zavodnika
order  by celkem desc
LaMMa
Profil
"Ale to jsem si moc nepomohl, protože se mi to bude řadit stejně jako když budu zadávat pořadí... Jenom budu složitěji zapisovat a počítat celkové body a to já nechci, já chci aby se mi to automaticky sčítalo a zároveň automaticky řadilo podle nejvyššího počtu bodu."

Samozrejme, ze by si celkove body nepocital rucne ale spravil si na to jednoduchu funkciu, ktoru by si volal pri pridani/zmene bodov nejakeho zapasu. Poradie by si potom nemusel vobec vyplnovat.
A ako riesis poradie, ked maju 2 tymi rovnaky pocet bodov?
Skeletonek
Profil *
Kajman Dekuji za typ,urcite to zkusim.
LaMMa ja to delam tak, ze se si to scita automaticky a poradi jsem doplnoval rucne, slozitym systemem. A to je na prd... Urcite zkusim co napsal Kajman
max.max
Profil
Kajman:
Chápu to prosím správně?Že MySQL bude vypadat takto?

CREATE TABLE tabulka_s_body(
id_zavodnika INTEGER PRIMARY KEY,
body_1 INTEGER DEFAULT 0,
body_2 INTEGER DEFAULT 0,
body_3 INTEGER DEFAULT 0)

A ve výsledku to bude vypadat asi takhle že ano? S tím, že kurzívou budu zapisovat ručně a tučně se to budou přepočítavat samo? Tak nějak bych si to přál a tak to zamýšlím.


A potom tvůj příkaz:
select id_zavodnika, sum(body) celkem
from   tabulka_s_body
group  by id_zavodnika
order  by celkem desc
Kajman
Profil
Tabulka na zápis bodů by měla být spíše takto nějak.
CREATE TABLE tabulka_s_body
  (
     id_zavodnika INTEGER NOT NULL,
     id_souteze   INTEGER NOT NULL,
     body         INTEGER DEFAULT 0,
     PRIMARY KEY (id_zavodnika, id_souteze)
  )
max.max
Profil
Kajman
Funguje to překrásně, je to paráda ! super, sám bych na to nepřišel !
Můžu ještě poprosit, kdybych to pořadí chtěl očislovat? první místo, druhé místo... inač paráda Děkují moc
Kajman
Profil
Prostě si přičtete jedničku.
<?php
$poradi=1;
while(nebo jiny cyklus)
{
  echo $poradi++;
}
?>
max.max
Profil
Nádhera. Běží jak hodinky, ale poslední prosba je, jak mám vypsat jednotlivé body? nedaří se mi to vypsat. Chci aby se mi vypsaly jednotlivé data z tabulky? Protože id_souteze budou závody a všichni id_zavodnika budou na id_souteze, ale chci je vypsat všechny id_zavodnika i id_souteze. zkoušel jsem to včera večer a nešlo mi to . Nevím jak na to. Děkují


<table width="200" border="1"> 
  <tr>
    <td>poradi</td>
    <td>zavodnik</td>
    <td>soutez</td>
    <td>body</td>
  </tr><?
  // zde je include souboru s konstantami
include("con.php");
  $vysledek=mysql_query("select sbor, soutez, body, sum(body) celkem
from   body
group  by sbor
order  by celkem desc");
$poradi=1;
  while ($zaznam=MySQL_Fetch_Array($vysledek)):
       ?>
  <tr>
    <td><?{
  echo $poradi++;
}
?>.</td>
    <td><?echo $zaznam["sbor"]?></td>
    <td><?echo $zaznam["soutez"]?><?echo $zaznam["body"]?></td>
    <td><?echo $zaznam["celkem"]?></td>
  </tr>
<?
    $sudy=!$sudy;    
  endwhile;
?>
</table>

Takhle to mám zatím.
juriad
Profil
snažíš se zároveň získat dvě různé úrovně detailu (celý sbor; body v jednotlivých zápasech) a to moc dobře nejde

můžeš buď zahodit GROUP BY, a pak se budou přenášet duplicitně informace ve zbývajících sloupcích (ale také všechny body),
nebo můžeš pro každý sbor položit do databáze další dotaz,
nebo zachovej stávající (bez body) a přidej jeden dotaz pro body všech sborů a JOIN si proveď ručně v php (ORDER BY ti pomůže)
nebo se podívej na GROUP_CONCAT (píše o něm Jakub Vrána, pozor na délku)

poslední možnost používá rozšíření SQL, a nepovažuje se za úplně čistou (databáze má poskytovat data a relace, nemá se starat o formát výpisu)
Kajman
Profil
max.max:
Také můžete přidat do dotazu modifikaci with rollup, jednotlivé řádky dát v php do dvojrozměrného pole a teprve následně vypsat toto pole.

A vypadá to, že do id si nedáváte obvyklý číselný identifikátor a nemáte číselník družstev a soutěží.

Jinak nad původní neuniverzální tabulkou šlo řadit také, kdyby ty sloupce byly číselného typu...
select ...
       (ifnull(`jedna`,0)+ifnull(`dve`,0)+ifnull(`tri`,0)) soucet
...
order  by soucet desc

Těžko říct, jestli si to chcete naprogramovat "správně a univerzálně" nebo "špatným přístupem, ale rychle".
max.max
Profil
Kajman:
Tuhle variantu jsem zamýšlel, když jsem skládal ty stránky. Jenomže neměl jsem ty součty tabulek ve výpisu DB, ale ve vypísu PHP, takže součet jsem měl, ale neměl jsem to seřazené podle maximálního bodu.
Zkusím něco vymyslet jak jste navrhl vy. Budu si s tím hrát, než na to přijdu.

Může to být postavené takhle?
  $vysledek=mysql_query("select sbor, soutez,(ifnull(`jedna`,0)+ifnull(`dve`,0)+ifnull(`tri`,0)) celkem
from   body
group  by sbor
order  by celkem desc");
$poradi=1;
  while ($zaznam=MySQL_Fetch_Array($vysledek)):



juriad:
Jo to je taky možnost, kdybych na nic nepřišel, vyzkouším Vaši variantu, ta by měla jit na 90% Budu si s tím hrát večer, ale i Vám děkují za odpověď

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0