Autor Zpráva
FEIL
Profil
Ahojte potreboval by som ako zapíšem umiestenie(RANK) do tabulky 12345678. Mám takú myšlienku len neviem ako to zapísať. Najpr by sa zistil počet zápisov v stlpci ID mysql_num_rows($id); Zistilo by sa že tam je dajme tomu 20 záznamov(riadkov) A teraz by som chcel aby do tej istej tabulky len do iného stpca vypísalo čísla od 1-20 takže kedy kolvek by sa dalo vyťiahnuť z databázi umiestenie daného teamu.

Alebo jednoduchšie potrebujem len pridať do tabulky rank ako je vo webových ligách.
Joker
Profil
FEIL:
Z toho popisu nechápu podstatu problému.

A teraz by som chcel aby do tej istej tabulky len do iného stpca vypísalo čísla od 1-20 takže kedy kolvek by sa dalo vyťiahnuť z databázi umiestenie daného teamu
Hm, uděláte sloupec číselného typu a do něj uložíte to dané číslo?

Mimochodem, není to pořadí nadbytečná informace? Resp. není v tabulce jiný sloupec (třeba body nebo tak něco), ze kterého to pořadí vyplývá?
AM_
Profil
Řádky tabulky se sčítají takto:
list($count) = mysql_fetch_row(mysql_query("SELECT COUNT(id) FROM teams"));

ale když už, tak takhle se to stejně neřeší, bylo by to neefektivní a nepružné. Správné řešení je sestavit databázový dotaz, který rovnou vrátí pořadí týmu (budu předpokládat, že každý tým má nějaké skóre ve sloupci score):

$currentTeam = mysql_query("SELECT score FROM teams WHERE id=$curentTeamId");
if (mysql_num_rows($currentTeam) == 0) throw new Exception("Team $currentTeamId does not exist!");
list($currentTeamScore) = mysql_fetch_row($currentTeam);
list($rank) = mysql_fetch_row(mysql_query("SELECT COUNT(id) FROM teams WHERE score > ".intval($currentTeamScore)));
$rank++; //je potreba zvysit o jedna, protoze pokud je tym prvni, existuje 0 tymu s vyssim score (ktere vyhleda predchozi dotaz)
echo "Team $currentTeamId 's rank: $rank";
TomášK
Profil
Mohl by se ti hodit dotaz z FAQ na číslování řádků:
set @poradi=0;
update tabulka_12345678 set rank=@poradi:=@poradi+1 order by body;


Pokud se pořadí počítá nějakým komplikovaným způsobem (body, skóre, vzájemný zápas, skóre vzájemného zápasu, ...) a používá se i jinde než pro výpis (statistiky apod.), pak nevidím nic špatného na tom si ho předpočítat. Efektivnější to bude určitě. Pokud se data nahrávají dávkově, lze to i snadno udržovat aktuální. Ale záleží na konkrétním případu, pro jeden výpis to smysl nemá.
AM_
Profil
TomášK:
pro jeden výpis to smysl nemá.
myslím, že dokud to není jeden výpis za sekundu, smysl to nemá. Pokud člověk nemusí hrát na výkon (statisíce družstev v tabulce a zobrazení několikrát za sekundu, dříve na výkon opravdu hrát nemusí), je jednodušší nic necachovat a vše počítat z minimálních uložených dat. Pak si člověk nemusí hlídat konzistenci cache a žádnou velkou nevýhodu to nepřináší... Nedávno jsem si ověřil v praxi, že jsem poměrně často používaný mezivýsledek začal cachovat... a za chvíli bylo v programu mnohem víc chyb a běžel mnohem pomaleji, tak jsem cache odstranil, vše začal počítat přímo, a nakonec to bylo i rychlejší.
Kcko
Profil
AM:
Tady pravdu nemas. Provozuji sportovni server a bez cache (jak serverove tak ve filesystemu) bych neprezil. A to nemam tisice nastevniku. Ale je to znat, pokud sestavujes vic vetsich dotazu na stranku.

Nedávno jsem si ověřil v praxi, že jsem poměrně často používaný mezivýsledek začal cachovat... a za chvíli bylo v programu mnohem víc chyb a běžel mnohem pomaleji, tak jsem cache odstranil, vše začal počítat přímo, a nakonec to bylo i rychlejší.
To bych tedy rad videl zpusob cachovani, ze to prinaselo takove vysledky.

Jinak, pokud je to napsane dobre, tak to zadne chyby produkovat nemuze.

Ja napr. po kazdem odeslanem zapase, prepocitam konkretni soutez (pregeneruji data a doplnim poradi jednotlivych tymu, ulozim do kese a vymazu starou kes).

Ma to vyhodu toho, ze znam poradi tymu v XY soutezich a mohu s tim dal v komplexnejsich statistikach pocitat.

Moderátor Str4wberry: Tvůj projev je špatně srozumitelný, piš prosím s diakritikou.
AM_
Profil
Pokud s tím často počítáš, je to zase jiná věc. Pokud je více složitých dotazů na stránku, tak také. OK, ale kde je hranice, je sporné...
Ale tady na JPW mám ve zvyku radit to nejjednodušší, a to udržování aktuální cache rozhodně není (ne že by to bylo složité, ale velmi náchylné k chybám...) a vzhledem k tomu, že pořadí lze spočítat dvěma jednoduchými dotazy, a pokud chci pořadí všech týmů tak dokonce jedním :), považuji mé řešení pro tento problém za lepší.
Kcko
Profil
AM:
No jasne, takhle se to neda od oka, zalezi na konkretni situaci. Ja jen vim, ze jsem s tim bojoval nekolik let, protoze ten portal jsem stavel uz po 3x a troufam si tvrdit, ze uz vim co a jak. Kdyz na 1 stranku vysypes
- tabulku poradi
- tabulku vzajemnych zapasu
- dalsich X statistik

A mas v tabulce uz X dat a pak treba jeste pocitas nejake historicke statistiky, tak pocitat to online to je zabijak.

:)

Moderátor Str4wberry: Tvůj projev je špatně srozumitelný, piš prosím s diakritikou.
FEIL
Profil
Aby som to upresnil:

<?
$kontrolka = "0";
echo '
<table border="0" align="center" width="100%"><tr>
<td style="font-weight: bold;">Body</td>
<td style="font-weight: bold;">Název</td>
<td style="font-weight: bold;">Tag</td>
<td style="font-weight: bold;">Popis</td>
<td style="font-weight: bold;">Založen</td>
<td style="font-weight: bold;">Odehráno zápasů</td>
<td style="font-weight: bold;">Hledá soupeře</td>
</tr>';
$liga_result = mysql_query("SELECT id, body, nazev, tag, popis, cas, zapasu, hleda FROM liga_klany ORDER BY body");
while($liga = mysql_fetch_array($liga_result)){ $kontrolka = "1";
echo "   <tr>
            <td>".$liga["body"]."</td>
            <td>".$liga["nazev"]."</td>
            <td>".$liga["tag"]."</td>
            <td>".$liga["popis"]."</td>
            <td>".$liga["cas"]."</td>
            <td>".$liga["zapasu"]."</td>
            <td>";
            if ($liga["hleda"] == "0") { echo "Nehledá"; } else { echo "Hledá"; } echo"</td></tr>";
}
echo "</table>";
if ($kontrolka == "0") echo "<br /><center>Pro tuto ligu neexistují žádne klany.</center><br />"; 
?>

Ale neni tam zobrazovanie ranku a to tam potrebujem doplniť.A však do DB to chcem preto aby ked bude chcieť nejaký team prijať výzvu na zápas
porovnali sa obidva ranky teamov a ak by medzi nimi bol rozdiel 100 tak by nebolo možné prijať zápas.

Moderátor Str4wberry: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
FEIL
Profil
AM to načrtol dobre len neviem ako to mám zakomponovať do toho mojho?
Kcko
Profil
Tak znova.

Prepocitas si tabulku pri vlozeni zapasu (tj dopocitas natvrdo pozice ..) to zvladnes ne?
Jinak porovnavat tymy jen podle ranku neni nic moc. Co kdyz mezi 1 a 30 bude rozdil jen 5 bodu?
Pokud to chces delat poradne , zamotal bych do toho nejaky ELO vzorecek.

Moderátor nightfish: Tak znova: Tvůj projev je špatně srozumitelný, piš prosím s diakritikou.
FEIL
Profil
Najlepšie by to bolo potom podla bodov ale ten rank to by mi potom stačil nejaký cyklus použiť len na vypísanie čísel od 1 do podla počtu riadkov (teda registrovaných teamov)
FEIL
Profil
AM:
Mohol by si mi trošku priblížiť čo ten script robí. Hore je udaná premená rovná 0 len neviem prečo je pred nou SET? a ptom nechápem tomúto: rank=@poradi:=@poradi+1
FEIL
Profil
Lebo som spravil $rank=0; $rank++; echo $rank; tankto to funguje ale ja to potrebujem do DB zapísať aby som v detailoch týmu napr mohol zobraziť rank daného teamu. Lebo hladať v tabulke z 500 tímamy že kde je ten moj a kolký vlastne som to by bolo na hlavu?
Dakujem že mi pomáhate lebo ja som amater.
Joker
Profil
FEIL:
Lebo hladať v tabulke z 500 tímamy že kde je ten moj a kolký vlastne som to by bolo na hlavu?
Pokud by se to mělo zobrazovat při každém načtení stránky nebo tak něco, tak to by možná problém byl, ale jestli profil týmu je něco jako tady profil uživatele, tj. (IMHO) stránka zobrazovaná občas až málokdy, nevidím takový problém to přepočítávat pokaždé.
Samozřejmě ne takhle cyklem, ale
SELECT COUNT(id) FROM liga_klany WHERE body > (body aktuálního týmu)
což už zmínil AM v [#2]
FEIL
Profil
A keby sa to malo zobrazovať často ??? tak ako napísal TomašK by to nešlo ????
AM_
Profil
FEIL:
Hore je udaná premená rovná 0 len neviem prečo je pred nou SET?
to není v mém skriptu :) toto je TomášKovo řešení, které zapíše pořadí do tabulky.

Můj skript funguje tak, že zjistí skóre aktuálního týmu, spočítá počet týmů s vyšším skóre a vypíše tento počet + 1, což je pořadí týmu.
Podobné srandičky lze dělat i když potřebuješ zjistit jestli je mezi danými tými rozdíl > 100, stačí v DB spočítat všechny záznamy, které mají skóre mezi těmito dvěma :)

[#8] Kcko
no, dělal jsem účetní systém, kde propojení třeba deseti tabulek ve složitém dotazu (ve výsledku možná desetitisíce řádků, vybíralo se tedy i z mnohem víc), a správné zaindexování databáze i takovéto dotazy srazilo na cca 0.01s...
Kcko
Profil
AM:
Ja se nepru. Jen rikam, ze ja potrebuju na strance vic nez 1 vypis a pak s temito udaji potrebuji pocitat i do historickych tabulek :)

Treba zjisteni pozic tymu v X soutezi za Y obdobi. Tak si predstav velky dotaz 30x :)
AM_
Profil
Kcko:
já se také nepřu :) jen říkám, že moje zkušenost je jiná, stovky zaměstnanců, desetitisíce služeb, počítání historie... a stejně jsem se obešel bez cache...
Kcko
Profil
Vidim to na soukromy rozhovor s ukazkami kodu :) protoze si 100% stojim za svym ze to snad ani lip uz napsat v php / mysql nejde :)
FEIL
Profil
Kcko tvoj script má jeden háček a ked je 10 tímov z rovnakým počtom bodov ako potom urči správny rank teamu??
FEIL
Profil
Ako mám to UPDATE použíť v MYSQL tak aby my to zoradovalo podla bodov alebo ja neviem ako to je spravené v ostatných ligách. Vážne by som bol štastný keby my to niekto pomohol už doriešiť.
Kcko
Profil
FEIL:
Nijak, vsechny jsou na prvnim miste. Resp. vsechny jsou 1-n. To zobrazis ve vypise vsech tymu. A kdyz jsi v nejakem prehledu a detailu o tymu tak mu zobrazis pozici "kolik tymu je pred nim" + 1.

Ja to u sebe resim taky tak.

Treba tu http://fifa.gameway.cz/grt , 2 hraci maji koeficient 1019
Tady to same http://fifa.gameway.cz/soutez/premier-league/1-rocnik-fifa2010-ps3/statistiky/hraci

Pokud by ti tohle reseni nevyhovovalo, ac me prijde spravne, muzes vymyslet nekolik kriterii, aby byla pravdepodobnost ze to nikdy nevznikne.

Tj. treba body, skore, vetsi pocet vstrelenych branek, mensi pocet obdrzenych, pocet zapasu ...atd.
FEIL
Profil
Všimol som si že tie teamy čo majú rovnaké body tak to majú riešené potom tak že sú potom zoradené abecedne.Len ja neviem ako to mám zapísať podla toho mojho. Vyzerá to takto
<?
$kontrolka = "0";
echo '
<table border="0" align="center" width="100%"><tr>
<td style="font-weight: bold;">Body</td>
<td style="font-weight: bold;">Název</td>
<td style="font-weight: bold;">Tag</td>
<td style="font-weight: bold;">Popis</td>
<td style="font-weight: bold;">Založen</td>
<td style="font-weight: bold;">Odehráno zápasů</td>
<td style="font-weight: bold;">Hledá soupeře</td>
</tr>';
$liga_result = mysql_query("SELECT id, body, nazev, tag, popis, cas, zapasu, hleda FROM liga_klany ORDER BY body");
while($liga = mysql_fetch_array($liga_result)){ $kontrolka = "1";
echo "   <tr>
            <td>".$liga["body"]."</td>
            <td>".$liga["nazev"]."</td>
            <td>".$liga["tag"]."</td>
            <td>".$liga["popis"]."</td>
            <td>".$liga["cas"]."</td>
            <td>".$liga["zapasu"]."</td>
            <td>";
            if ($liga["hleda"] == "0") { echo "Nehledá"; } else { echo "Hledá"; } echo"</td></tr>";
}
echo "</table>";
if ($kontrolka == "0") echo "<br /><center>Pro tuto ligu neexistují žádne klany.</center><br />"; 
?>
xmark
Profil
FEIL:
.. ORDER BY body, nazev, cokoliv
FEIL
Profil
Bavíme sa o tomto toto je script ktorý vypočíta počet teamov ktoré majú viac bodov ako daný team.

$currentTeam = mysql_query("SELECT score FROM teams WHERE id=$curentTeamId");
if (mysql_num_rows($currentTeam) == 0) throw new Exception("Team $currentTeamId does not exist!");
list($currentTeamScore) = mysql_fetch_row($currentTeam);
list($rank) = mysql_fetch_row(mysql_query("SELECT COUNT(id) FROM teams WHERE score > ".intval($currentTeamScore)));
$rank++; //je potreba zvysit o jedna, protoze pokud je tym prvni, existuje 0 tymu s vyssim score (ktere vyhleda predchozi dotaz)
echo "Team $currentTeamId 's rank: $rank";


Ktorý ja potrebujem upraviť tak aby som to mohol použiť lebo neviem čo si mám dosadiť za currentteam a dalšie. Tak už to len nejak dajme dokopi.
FEIL
Profil
Už som to spravil KCKO podla teba funguje to. A je to logické že ked majú teamy rovnaký počet bodov tak sú na rovnakom mieste.Ešte prikladám moj php kod pre pomoc druhým :
<?
$team = mysql_query("SELECT body FROM liga_klany WHERE id='$klan_get' AND liga='".$_GET["id"]."'");
if (mysql_num_rows($team) == 0) throw new Exception("Team does not exist!");
list($TeamScore) = mysql_fetch_row($team);
list($poradie) = mysql_fetch_row(mysql_query("SELECT COUNT(id) FROM liga_klany WHERE body > ".intval($TeamScore)));
$poradie++; //je potreba zvysit o jedna, protoze pokud je tym prvni, existuje 0 tymu s vyssim score
Kcko
Profil
FEIL:
Ozvi se mi na ICQ. Dam Ti k dispozici svoje kody, nebo Ti je rovnou naimplementuji. Cestou napric touto diskusi by to bylo jeste na dlouho.
Hologos
Profil
$team = mysql_query("SELECT body FROM liga_klany WHERE id='$klan_get' AND liga='".$_GET["id"]."'");


Pozor na MySQL Injection!

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