Autor Zpráva
Pavel T.
Profil *
Dobrý den, tvořím si takový "tipérský koutek", kde uživatelé můžou tipovat na zápasy ve sportu.
Funguje mi to dle předpokladů, ale problém mám, že nevím jak udělat řazení podle bodů(body nemám ve sloupci v db, počítají se v php)

echo "<table width='100%'>
<tr>
<td>Uživatel</td>
<td>Zápasů</td>
<td>Výher</td>
<td>Proher</td>
<td>Bodů</td>
</tr>";
$sql_tipy = MySQL_Query("SELECT * FROM soutez_tipy GROUP BY id_uzivatele");
while ($row_tipy = mysql_fetch_assoc($sql_tipy)) { 

$sql_uziv = MySQL_Query("SELECT * FROM users WHERE id='".$row_tipy["id_uzivatele"]."'");
$row_uzivatel = MySQL_Fetch_Array($sql_uziv);

$num = mysql_result(MySQL_Query("SELECT count(*) FROM soutez_tipy WHERE id_uzivatele = ".$row_uzivatel['id']." "), 0);
$num2 = mysql_result(MySQL_Query("SELECT count(*) FROM soutez_tipy INNER JOIN soutez_zapasy ON soutez_tipy.id_zapasu=soutez_zapasy.id WHERE soutez_tipy.tip=soutez_zapasy.kdo_vyhral AND id_uzivatele = ".$row_uzivatel['id']." "), 0);

$proher=$num-$num2;
$body=2*$num2-2*$proher;

echo "
<tr>
<td>".$row_uzivatel['login']."</td>
<td>$num</td>
<td>$num2</td>
<td>$proher</td>
<td>$body</td>
</tr>
";
}
echo "</table>";
Lze nějak docílit, aby se uživatelé řadili podle bodů? Nebo je tento navrh špatný?
lionel messi
Profil
Pavel T.:
Lze nějak docílit, aby se uživatelé řadili podle bodů? Nebo je tento navrh špatný?
Odporúčal by som vytvoriť stĺpec s bodmi už v db, zoradenie to výrazne zjednoduší (doplnenie ORDER BY body DESC na koniec SQL dotazu sa o to postará).

V PHP je to trochu zložitejšie, aspoň z môjho pohľadu, nie som žiadny expert, ale možno by som si skúsil naskladať dáta do poľa a potom použiť funkciu sort alebo asort. Rozhodne by som však zaradil stĺpec s bodmi už do db.
Tori
Profil
Zkuste, co vám vyhodí tenhle dotaz (nezkoušela jsem, ale mohlo by to tak nějak zhruba vypadat):
SELECT id, login, (tipy - vyhry) AS prohranych, (2 * vyhry - 2 * (tipy - vyhry)) AS body 
FROM 
(SELECT u.id, u.login, COUNT(t.id_uzivatele) AS tipy, COUNT(z.id) AS vyhry
FROM `users` u
INNER JOIN soutez_tipy t ON t.id_uzivatele = u.id
LEFT JOIN soutez_zapasy z ON t.id_zapasu = z.id AND t.tip = z.kdo_vyhral
GROUP BY u.id) t
ORDER BY body DESC
edit: opraveno
Pavel T.
Profil *
Tori:
Oh, díky, ale vůbec nevím kam to mám dát, mám

echo "<table width='100%'>
<tr>
<td>Uživatel</td>
<td>Zápasů</td>
<td>Výher</td>
<td>Proher</td>
<td>Bodů</td>
</tr>";
$sql_tipy = MySQL_Query("SELECT u.id, u.login, (tipy - vyhry) AS prohranych, (2 * vyhry - 2 * (tipy - vyhry)) AS body 
FROM 
(SELECT u.id, u.login, COUNT(t.id_uzivatele) AS tipy, COUNT(z.id) AS vyhry
FROM `users` u
INNER JOIN soutez_tipy t ON t.id_uzivatele = u.id
LEFT JOIN soutez_zapasy z ON t.id_zapasu = z.id AND t.tip = z.kdo_vyhral
GROUP BY u.id)
ORDER BY body DESC");
while ($row_tipy = mysql_fetch_assoc($sql_tipy)) { 

$sql_uziv = MySQL_Query("SELECT * FROM users WHERE id='".$row_tipy["id_uzivatele"]."'");
$row_uzivatel = MySQL_Fetch_Array($sql_uziv);

$num = mysql_result(MySQL_Query("SELECT count(*) FROM soutez_tipy WHERE id_uzivatele = ".$row_uzivatel['id']." "), 0);
$num2 = mysql_result(MySQL_Query("SELECT count(*) FROM soutez_tipy INNER JOIN soutez_zapasy ON soutez_tipy.id_zapasu=soutez_zapasy.id WHERE soutez_tipy.tip=soutez_zapasy.kdo_vyhral AND id_uzivatele = ".$row_uzivatel['id']." "), 0);

$proher=$num-$num2;
$body=2*$num2-2*$proher;

echo "
<tr>
<td>".$row_uzivatel['login']."</td>
<td>$num</td>
<td>$num2</td>
<td>$proher</td>
<td>$body</td>
</tr>
";
}
echo "</table>";
ale nci to nevypisuje
Tori
Profil
Já myslela spustit úplně někde mimo, v PhpMyAdmin nebo Admineru, jako test, jestli to vypisuje správné výsledky. Mělo by to vracet seznam uživatelů + body + počet výher, seřazený podle bodů. Tak jestli to počítá správně, nebo vyhazuje chybu nebo co.
Pavel T.
Profil *
Tori:
aha, zkouším v phpmyadminu a píše to #1248 - Every derived table must have its own alias
Tori
Profil
opravila jsem ve [#3]
Pavel T.
Profil *
Tori:
paráda, už to vypisuje :) Děkuji moc


Ještě dotaz dá se z tohodle dotazu zjistit výhry a zápasy

u ostatních jsem použil ".$row_tipy['prohranych'].", ".$row_tipy['body'].", ".$row_tipy['login']."
Pavel T.
Profil *
Dobrý den, mám zde ještě jeden snad "malý" problém. Když někdo tipuje na zápas, tak se mu v tich statistikách rovnou zapíše prohra, ikdyž zápas není vyhodnocen ještě. Uzavírání zápasu mám u tabulky soutez_zaapsy ve sloupci stav_zapasu. 1 značí, že zápas je uzavřen(vyhodnocen) 0 značí, že ještě nebyl vyhodnocen. Potřeboval bych někam do toho dotazu napsat, aby se vypsali pouze výsledky z.stav_zapasu='1' zkoušel sem do toho dotazu to napsal všelijak, ale nefunguje to jak má. Aktuálně mám:
SELECT id, login, tipy, vyhry, (tipy - vyhry) AS prohranych, (2 * vyhry - 2 * (tipy - vyhry)) AS body 
FROM 
(SELECT u.id, u.login, COUNT(t.id_uzivatele) AS tipy, COUNT(z.id) AS vyhry
FROM `users` u
INNER JOIN soutez_tipy t ON t.id_uzivatele = u.id
LEFT JOIN soutez_zapasy z ON t.id_zapasu = z.id AND t.tip = z.kdo_vyhral
GROUP BY u.id) t
ORDER BY body DESC
lionel messi
Profil
Skúste:
SELECT id, login, tipy, vyhry, (tipy - vyhry) AS prohranych, (2 * vyhry - 2 * (tipy - vyhry)) AS body 
FROM 
(SELECT u.id, u.login, COUNT(t.id_uzivatele) AS tipy, COUNT(z.id) AS vyhry
FROM `users` u
INNER JOIN soutez_tipy t ON t.id_uzivatele = u.id
LEFT JOIN soutez_zapasy z ON t.id_zapasu = z.id AND t.tip = z.kdo_vyhral
WHERE z.stav_zapasu = 1
GROUP BY u.id) t
ORDER BY body DESC
Pavel T.
Profil *
lionel messi:
Díky, tohle funguej zdá se vpohodě, nicméně nějak sem narazil na problém, že se mi ukazují pouze výsledky, když jsme správně tipnul výhru, pokud jsme tipnul prohru vůbec se neukazuje ve statistikách mezi prohraných a ani se nepočítá do celkových tipů(vůbec tam není)


+ když odeberu WHERE z.stav_zapasu = 1 tak se to zobrazuje správně (pokdu teda mám vyhodnocený všechny zápasy)
Tori
Profil
smazáno, blbost
lionel messi
Profil
Ešte môžete skúsiť:
SELECT id, login, tipy, vyhry, (tipy - vyhry) AS prohranych, (2 * vyhry - 2 * (tipy - vyhry)) AS body 
FROM 
(SELECT u.id, u.login, COUNT(t.id_uzivatele) AS tipy, COUNT(z.id) AS vyhry
FROM `users` u
INNER JOIN soutez_tipy t ON t.id_uzivatele = u.id
LEFT JOIN soutez_zapasy z ON t.id_zapasu = z.id AND t.tip = z.kdo_vyhral
GROUP BY u.id) t
WHERE z.stav_zapasu = 1
ORDER BY body DESC

Ale netuším, či to niečo dokáže zmeniť.
Pavel T.
Profil *
lionel messi:
tady se mi nic nevypíše, pokud odeberu WHERE z.stav_zapasu = 1 tak se to zobrazuje správně (pokud teda mám vyhodnocený všechny zápasy)
Pavel T.
Profil *
Koukám do toho už zase hodinu a vůbec nemůžu přijít, proč to ukazuje pouze výherní tipy a né i proherní, když mám WHERE z.stav_zapasu = 1
Ikdyž mám natipováno 2 zápasy a jsou oba vyhodnocené(jeden - výherní, druhý - proherní) tak mi to ukazuje, že mám celkem tipů 1 a výher taky 1, přitom by to mělo být
tipů 2, výher:1, proher:1, nevděl by někdo včem je chyba?
Tori
Profil
Mám pocit, že ve WHERE ta podmínka ovlivňuje všechny nalezené záznamy (tedy i prohrané), zatímco vy chcete víc omezit jen podmnožinu vyhraných. Zkuste tohle:
SELECT id, login, tipy, vyhry, (tipy - vyhry) AS prohranych, (2 * vyhry - 2 * (tipy - vyhry)) AS body 
FROM 
(SELECT u.id, u.login, COUNT(t.id_uzivatele) AS tipy, COUNT(z.id) AS vyhry
FROM `users` u
INNER JOIN soutez_tipy t ON t.id_uzivatele = u.id
LEFT JOIN soutez_zapasy z ON t.id_zapasu = z.id AND t.tip = z.kdo_vyhral AND z.stav_zapasu = 1
GROUP BY u.id) t
ORDER BY body DESC
Pavel T.
Profil *
Tori:
Toto už jsem zkoušel, bohužel to nic nedělá (započítává to i nevyhodnocené zápasy)

jen mě teď napadlo není blbě COUNT(z.id) AS vyhry, nemělo by tam být něco jako t.tip = z.kdo_vyhral AS vyhry
Tori
Profil
Pavel T.:
Jo, je to blbě, zkuste COUNT(IF(t.tip = z.kdo_vyhral, 1, NULL)) AS vyhry nebo něco takového, já už radši dneska radit nebudu. :-/
Pavel T.
Profil *
Tori:
Já už jsem se ... a přepsal jsem to nakonec jak poradil [#2] lionel messi, tak to je asi nejvhodnější stejně ne? I tak ti moc děkuji :)

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: