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
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
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
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
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
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;
Další pak třeba přidávat po jednom
$data[$row['id']]['sloupec']=$row['sloupec'];
nebo to také sloučit hromadně, pokud nebudou kolize názvů sloupců.
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
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.

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