Autor | Zpráva | ||
---|---|---|---|
Grovik Profil |
Už druhý dne marně přemýšlím jak elegantně vyřešit tento problém.
Mám tabulku v MySQL z ní vezmu nějaká data, sečtením některých sloupců vzniknou další položky (to je důležité). Celý výstup mám teď nasměrovaný do tabulky (Bootstrap 3). Jde o tohle. Potřeboval bych přibližně podle hodnot v pěti sloupcích co se vykreslují do té tabulky podbarvit pozadí buněk a to tak, aby se jednak nerozhodilo řazení, jednak to vybarvování by v každém sloupci rozděleno tak že 5% nejsprávnějších hodnot bude zelených, 5% nejšpatnějších červených. To stejné 20% oranžová a mezi tím kolem středu výsledků bez barviček (jo je to takový semafor). Nedaří se mi přijít na rozumný způsob, který by jednak umožnil to vykreslit a zároveň seřadit a zároveň to vybarvit. Dobrá rada nad zlato ;-). |
||
Kajman Profil |
Pokud je ta MySQL ve verzi, která umí window funkce, tak to půjde rovnou v dotazu.
Tuším, že to jde od MySQL 8.0+ či MariaDB 10.2+ Pokud ne, tak si v php dáte výsledky do pole a postupně to procházíte a počítáte a až si uděláte analýzu, tak teprve to pole vykreslíte. |
||
Grovik Profil |
#3 · Zasláno: 28. 1. 2020, 11:35:05
Kajman:
Díky za tip. To MySQL nepůjde je to z několika DB a z několika tabulek (agregované výsledky), ale tip je to dobrý tyhle funkce jsem neznal. S tím polem je to složitější a už jsem tím směrem pokročil. Problém je v tom, že ty data jsou na sebe navázaná. Tzn. výsledek C jde získat až když znám výsledek A a B ty jsou jako separátní dotazy (dvě různé DB). Napadlo mě, označit si všechny potenciálně zobrazené položky v tabulce s tím, že až bude všechny vykreslené projdu to znovu a nahradím značky tak aby se obarvili tzn, css parametr. Ale trošku si nejsem jistý jak ty pole seřadit a jak to celé projít abych dostal ty procentuální hodnoty správně protože počet položek v každé generované tabulce je jiný. :-/ Něco jsem zkoušel, ale výsledek je spíš náhodný výbuch než fungující řešení. |
||
Kajman Profil |
#4 · Zasláno: 28. 1. 2020, 11:47:13
Pokud si to pole budete indexovat jedinečným klíčem (klidně kombinací více klíčů), tak si přece data do pole můžete dávat z různých zdrojů.
|
||
Grovik Profil |
#5 · Zasláno: 28. 1. 2020, 12:06:52
Kajman:
Ano, používám ID z tabulky jako identifikátor. Protože se neopakuje jinde než na jednom řádku je to použitelné. Problém je ten zdroj dat. Abych to úplně rozebral zkusím to nastínit. PoleIDuzivatelů { $a = JmenoUzivatele($id); $b = OdpracovaneHodiny($id); .... .... $tabulka .$a. $b. $c. ..... echo $tabulka; } Můj plán je buňky tabulky označit a podle toho jak dopadne řazení toho pole, které bude vždy pro jeden sloupec tak je nahradit patřičnou barvou (aby okénko tabulky správně označilo). pole pro daný sloupec si představuji takhle $pole[$id] = $a; Při průchodu pole by se to moje pole mělo naplnit jak správným ID tak správnou hodnotou. Následně spočítat položky pole a následně průměr hodnot pole. Z toho už půjde snadno spočítat v jakém pořadí jsou. Pak následuje další problém a to je pole kde je 0 nejsprávnější hodnota vše nad nulu a pod nulu je blbě (to aby to nebylo moc snadné). Tam si nejsem úplně jistý jak to naroubovat. |
||
Kajman Profil |
#6 · Zasláno: 28. 1. 2020, 12:27:56
Průměr je něco jiného než medián. Podle 1. příspěvku to vypadalo, že chcete počítat percentil pro více sloupců - a no ty byly ty window funkce ideální.
|
||
Grovik Profil |
#7 · Zasláno: 28. 1. 2020, 12:34:36
Já bych radši počítal rovnou v DB, ale takhle budu odkázaný na jednotlivé pole a průměrování :-/.
|
||
Kajman Profil |
Stále nechápu, kde máte problém. Pokud máte více uživatelů pro různé databáze a nejde to jedním dotazem, tak i pro ty mezivýsledky si můžete v databázi spočítat percentily. Klidně pro několik sloupců jedním dotazem.
V php bych to spíše dával do pole polí než dělat více polí pro každý sloupec. První můžete $data[$row['id']]=$row; $data[$row['id']]['sloupec']=$row['sloupec']; |
||
Grovik Profil |
U těch polí vnímám jako problém potřebu řadit každé jinak. Tzn. Jedno pole má jako 100% úspěšnost nulu a vše ostatní je špatně čím víc tím víc.
Druhé má zase hodnoty od nejvyšší do nejnižší s tím že v obou případech je potřeba to označit (to ani nemluvím, jak s tím označením) protože budu podle různého počtu položek, určit v které části rozsahu jsou i když to jsem si včera načrtl jak by to mohlo fungovat a zdá se že by mohlo. I když dvě vnořené FOR mi přijdou jako fakt nepěkná věc. Vím že to zní jako, že pořád držkuju. Já se tu tím probírám a narážím na různé problémy a už mi to leze na mozek :D. Dost možná nevidím zjevné. Každopádně díky za rady, protože každý nápad i když nevede k cíli je přínosný. |
||
Grovik Profil |
#10 · Zasláno: 29. 1. 2020, 08:24:40
Nakonec jsem to vyřešil trošku oklikou a hodně kreativně ;-).
1. Vygeneroval jsem celou tabulku. V tabulce jsou v patřičných buňkách třídy v podobě "Class = "XX".$id"" 2. Vytvořil jsem si řadu polí s hodnotami kde hodnota odpovídá hodnotě v tabulce a klíč v poli ID (tedy řádku) 3. Tabulku generuji do proměnné tu pak projdu a pomocí podmínky uvnitř Foreach( $pole as $key=>$value) nastavím ty třídy podle těch ID na správnou hodnotu. foreach ($obchazeni as $key => $value) { if ($value == 0) { $htmlvystup = str_replace("ob".$key,"bg-success", $htmlvystup); } } Přiznávám, že to není příliš elegantní, rád pokud možno poznám ještě lepší řešení. Z mnoha nápadů co tu zazněli je nejlepší ten hodit to na hrb MySQL což je v mém případě problém, kvůli verzím, které jsou na serverech, které nemůžu v současnosti ovlivnit. |
||
Časová prodleva: 4 roky
|
0