« 1 2
Autor Zpráva
Pepik1
Profil
Kajman:
Já nemohu do struktury tabulky bohužel sahat. Nešlo by se ptát co je v exercise.type a podle toho převést exercise.value na ten formát?
Kajman
Profil
Nic jiného vám asi nezbyde. Vyplňte si přeci jen tu temporary tabulku. Omezíte tam kategorii i převedete typ dle kategorie. A kopněte do koulí toho, kdo to jako string navrhnul.
Pepik1
Profil
Kajman:
To si říkám celý den, pomhl by jste mi stím prosím. Jsem začátečník. Budu Vám moc vděčný.
Kajman
Profil
Pepik1:
Nešlo by se ptát co je v exercise.type a podle toho převést exercise.value na ten formát?

Co je exercise.value? Dříve jste psal, že hodnota je v challenge_result.value. Pak těžko říct, jestli ten sloupec type je challenge_result nebo nějaké další tabulce exercise. Tím, že vždy řeknete jen část informací nám to moc neulehčujete.

Jestli chcete pomoci, tak nachystejte struktury tabulek a vzorek dat např. na sqlfiddle.com. Můžete k tomu použít v Admineru export do sql formátu.
Pepik1
Profil
Kajman:
„Nešlo by se ptát co je v exercise.type a podle toho převést challenge_result.value na ten formát?“ Má to být takle. Omlouvám se. Jdu to tam dát.


Tak tady to je.
sqlfiddle.com/#!9/ab1e10/1
Kajman
Profil
Snad by šlo něco takového...

CREATE temporary TABLE chr_tmp AS
  SELECT chr.user_id,
         chr.exercise_id,
         CASE
           WHEN e.type = 'number' THEN Cast(chr.value AS SIGNED INTEGER)
           WHEN e.type = 'float' THEN Cast(REPLACE(chr.value, ',', '.') AS SIGNED)
           WHEN e.type = 'time' THEN Time_to_sec(Cast(chr.value AS time))
         END * CASE
                 WHEN e.order_num = 'ASC' THEN -1
                 WHEN e.order_num = 'DESC' THEN 1
               END value
  FROM   challenge_result chr
         JOIN registration reg
           ON chr.user_id = reg.user_id
              AND reg.category_id = 11
         JOIN exercise e
           ON chr.exercise_id = e.id
  WHERE  exercise_id IN ( 31, 32, 34 );

CREATE temporary TABLE chr_tmp2
  (INDEX pomocny_index (exercise_id, value)) AS
  SELECT * FROM chr_tmp;

SELECT t3.*,
       users.first_name
FROM   (SELECT user_id,
               Sum(poradi) soucet,
               Count(*)    kategorii
        FROM   (SELECT t1.user_id,
                       exercise_id,
                       (SELECT Count(DISTINCT t2.value)
                        FROM   chr_tmp2 t2
                        WHERE  t2.exercise_id = t1.exercise_id
                               AND t2.value <= t1.value) poradi
                FROM   chr_tmp t1) r
        GROUP  BY user_id) t3
       JOIN users
         ON t3.user_id = users.id
ORDER  BY soucet,
          kategorii DESC  
Pepik1
Profil
Kajman:
Tak vypadá, že to funguje parádně. Jen je naopak to přiřazení pořadí. Takže nejhorší má nejmenší skore, a nejlepší nejvyšší ale mělo by to být naopak.
A poslední věc a pak už to bude paráda, když se stane, že mají stejný skore. přidá to body takto
1
2
2
2
3

Ale mělo by to být
1
2
2
2
5

A pak to bude komplet.
Keeehi
Profil
Pepik1:
A poslední věc a pak už to bude paráda, když se stane, že mají stejný skore. přidá to body takto
A když se tě přesně na toto ptal včera Kajman, tak jsi tvrdil, že chceš tu první variantu.
Kajman
Profil
Pepik1:
Jen je naopak to přiřazení pořadí. Takže nejhorší má nejmenší skore, a nejlepší nejvyšší ale mělo by to být naopak.
Tak si přehoďte stringy 'ASC' a 'DESC' na řádcích 9 a 10, aby to nastavovalo obráceně koeficient 1 nebo -1.

když se stane, že mají stejný skore. přidá to body takto
Výpočet pořadí, tak jak jste to včera odmítal, by pak mohl být
SELECT Count(*) + 1
FROM   chr_tmp2 t2
WHERE  t2.exercise_id = t1.exercise_id
       AND t2.value < t1.value
Pepik1
Profil
Keeehi:
"A user_1 má dostat za kategorii b dva body nebo tři? Většinou když jsou dvě zlaté mediale, tak se pak dá totiž bronzová a vy tam máte stříbrnou."

Ano user_1 má dostat stříbrnou tudíž 2, ale další už nemá dostat 3, ale rovnou 4.
Kajman
Profil
To nedává smysl. Když pořadí není systémově určené, ale každému uživateli ho určujete jinak, tak si to budete muset počítat ručně.
Pepik1
Profil
Kajman:
Tak dík, moc už to funguje jak má.
Jseš nejlepší. Fakt díky. Todle bych nedal nikdy dohromady :-)
Pepik1
Profil
Tak ještě 1 problém, píše mi to furt tu chybu " Query was empty". Nevíte někdo co stím? V admineru to šlape jak má.
Keeehi
Profil
Pepik1:
A jak tvůj PHP kód vypdá teď?
Pepik1
Profil
Keeehi:
<?php

include("db.php");

$connect = MySQL_PConnect($cfg['MySQL_Server'], $cfg['MySQL_User'], $cfg['MySQL_Passwd']);
if (!$connect)
{
    print 'Pripojen? k MySQL se nezdarilo!!';
    exit;
}
MySQL_Select_DB($cfg['MySQL_DB']);
@mysql_query("SET NAMES utf8");
 
$chr_tmp = "CREATE temporary TABLE chr_tmp AS
  SELECT chr.user_id,
         chr.exercise_id,
         CASE
           WHEN e.type = 'number' THEN Cast(chr.value AS SIGNED INTEGER)
           WHEN e.type = 'float' THEN Cast(REPLACE(chr.value, ',', '.') AS SIGNED)
           WHEN e.type = 'time' THEN Time_to_sec(Cast(chr.value AS time))
         END * CASE
                 WHEN e.order_num = 'ASC' THEN -1
                 WHEN e.order_num = 'DESC' THEN 1
               END value
  FROM   challenge_result chr
         JOIN registration reg
           ON chr.user_id = reg.user_id
              AND reg.category_id = 11
         JOIN exercise e
           ON chr.exercise_id = e.id
  WHERE  exercise_id IN ( 32 )";  
  
$vysledek = mysql_query($chr_tmp) or die(mysql_error());  
 
$chr_tmp2 = "CREATE temporary TABLE chr_tmp2
  (INDEX pomocny_index (exercise_id, value)) AS
  SELECT * FROM chr_tmp";
$vysledek = mysql_query($chr_tmp2) or die(mysql_error());    
 
$query = mysql_query("SELECT t3.*,
       users.first_name
FROM   (SELECT user_id,
               Sum(poradi) soucet,
               Count(*)    kategorii
        FROM   (SELECT t1.user_id,
                       exercise_id,
                       (SELECT Count(*) + 1
                        FROM   chr_tmp2 t2
                        WHERE  t2.exercise_id = t1.exercise_id
                               AND t2.value < t1.value) poradi
                FROM   chr_tmp t1) r
        GROUP  BY user_id) t3
       JOIN users
         ON t3.user_id = users.id
ORDER  BY soucet,
          kategorii DESC"); 
          
$vysledek = mysql_query($query)or die(mysql_error());    
          

 ?>
Kajman
Profil
Vypisujte si, který dotaz to způsobuje. Ale pconnect v kombinací temporary tabulkami může způsobovat problém. Použijte connect.
Pepik1
Profil
Kajman:
Už jsem se pohnul. Musel jsem navyšit práva na straně poskytovatele. Snad už to půjde.
Pepik1
Profil
Všechno šlape parádně Fakt moc díky chlapy. A chci se zeptat šlo by ještě, z databáze vybrat (SELECT) exercise_id(xx) - >challenge_result.value? Jestli to nejde vyřeším to jinak.

user_id; soucet ;kategorii ;first_name ;exercise_id(32) ;exercise_id(34);...
Kajman
Profil
V sql se nedělají jednoduše dynamické počty sloupců.

Asi bych si do té první temporary tabuly přidal i sloupec s původní hodnotou...
chr.value as value_original

Pak bych si udělal dotaz na tu tabulku.
select * from chr_tmp
načítal všechny řádku, dával si je do dvojrozměrného pole s indexy [user_id][exercise_id], a při výpisu následného součtového dotazu postupně přidal i sloupce na základě toho php pole.

Pro inspiraci se můžete podívat např. na Výpis z DB s proměnným počtem sloupců na tvorbu pole $summary.

A doufám, že víte, že ta čísla v dotaze (11, 32, 34) můžete díky php měnit podle potřeby a nemusíte pro každou kategorii dělat soubor se skoro stejným dotazem.
Pepik1
Profil
Kajman:
Super děkuji za radu. Tak to mám řešený, jen mě zajímalo jestli nejde to udělat nějak elegantně v dotazu.
Pepik1
Profil
Kajman:
A chtěl jsem udělat podmínku, že pokud t2.value nebude v tabulce. přičte to 1000bodu. A nedaří se mi to. Co, prosím dělám špatně?
SELECT IF(value_original IS NULL,Count(*) + 1000,Count(*) + 1)
Kajman
Profil
Proto tam je již od začátku výpočet počtu soutěží, kterých se zúčastnili (sloupec kategorii), aby se řadilo podle počtu účastí a pak teprve podle součtu bodů.

Takže, pokud sčítáte 3 soutěže, stačí
t3.soucet + (3 - t3.kategorii) * 1000 as upraveny_soucet
Případně takový výpočet uděláte až v php.

Ale nyní tam budou vždy jen lidé, co se zúčastnili alespoň jedné soutěže. Kdyby tam měli být i ti, co jsou zaregistrovaní do kategorie 11, ale nikde nebyli, muselo by se to ještě upravit.
Pepik1
Profil
Kajman:
Super, v php to funguje, a kdybych to chtěl dát do toho dotazu kam přesně to mám umístit?
Kajman
Profil
K nebo místo t3.*
« 1 2

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