Autor | Zpráva | ||
---|---|---|---|
Pepik1 Profil |
#1 · Zasláno: 18. 5. 2018, 23:51:27
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 |
#2 · Zasláno: 19. 5. 2018, 00:04:39
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 |
#3 · Zasláno: 19. 5. 2018, 00:16:29
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 |
#4 · Zasláno: 19. 5. 2018, 08:20:46
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 |
#6 · Zasláno: 19. 5. 2018, 13:17:31
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 |
#7 · Zasláno: 19. 5. 2018, 14:03:12
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 |
#9 · Zasláno: 19. 5. 2018, 14:21:13
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 |
#10 · Zasláno: 19. 5. 2018, 14:41:10
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 |
#11 · Zasláno: 19. 5. 2018, 14:54:43
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 |
#12 · Zasláno: 19. 5. 2018, 15:02:51
Kajman:
Tak dík, moc už to funguje jak má. Jseš nejlepší. Fakt díky. Todle bych nedal nikdy dohromady :-) |
||
Pepik1 Profil |
#13 · Zasláno: 20. 5. 2018, 16:35:27
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 |
#14 · Zasláno: 20. 5. 2018, 17:05:24
Pepik1:
A jak tvůj PHP kód vypdá teď? |
||
Pepik1 Profil |
#15 · Zasláno: 20. 5. 2018, 17:17:10
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 |
#16 · Zasláno: 20. 5. 2018, 17:55:36
Vypisujte si, který dotaz to způsobuje. Ale pconnect v kombinací temporary tabulkami může způsobovat problém. Použijte connect.
|
||
Pepik1 Profil |
#17 · Zasláno: 20. 5. 2018, 18:03:15
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 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 |
#21 · Zasláno: 21. 5. 2018, 17:46:56
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 |
#22 · Zasláno: 21. 5. 2018, 20:40:22
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 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 |
#23 · Zasláno: 21. 5. 2018, 20:59:12
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 |
#24 · Zasláno: 21. 5. 2018, 21:28:03
K nebo místo t3.*
|
||
Časová prodleva: 6 let
|
0