výpis z datbáze do „matice“

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Oggy
Člen | 306
+
0
-

mám prosbu asi úplně nepatří do nette fora, ale ..potřebuji nápad jak by šli vypsat data do takové maticové struktury..

tabulka:
produkt ..název produktu

mnozstvi .. mnozstevni limit pro urcitou vysi ceny

a cena .. která spojuje produkt a mnozstvi – a urcuje cenu pro produkt pri nakupu urciteho poctu

tedy produkt ma vice cen zavislych na mnozstvi

chtel bych jej vypsat do takoveto tabulky:

**** | produkt1 | produkt 2 | atd

1 ks | 2,20 | 3,30

5 ks | 2 | –

15 ks | 1,80 | 2,80

jak nejlépe zpracovat nějaký takovýto dotaz do výše popsané tabulky

model:

<?php
dibi::query('SELECT nazev, mnozstvi, cena
            FROM produkt
            LEFT JOIN cenik USING(produktId)
            LEFT JOIN mnozstvi USING(mnozstviId);
?>

chtěl jsem použít datasoure a pak to rozsekat na radu produktu ..radu mnozstvi atd …ale při těch joinech to sestavovalo dotaz který házel chybu ..nebyly určeny aliasy pro poddotazy co vytvořil..

Editoval Oggy (30. 6. 2010 13:01)

Ani
Člen | 226
+
0
-

http://en.wikibooks.org/…/Pivot_table

Já to používám pro tabulku oprávnění, takže moje role je tvůj produkt, zdroj mnonžství a samotné hodnota oprávnění cena. Zapsat to nějak do jednoho dotazu mi nešlo (kvůli proměnlivému množství rolí), takže si nejdřív načtu role, udělám ten „trik“ se SUM a pak připojim ten dotaz:

<?php
        $query = "SELECT pravo, id, ";

        $roles = $this->getRoles();

        foreach ($roles as $i => $role) { //prevraceni tabulky
            if ($i == count($roles)-1) // posledni je bez carky na konci
                $query = $query . "SUM(if( role = '$role[name]', allowed, NULL)) AS '$role[name]'";
            else
                $query = $query . "SUM(if( role = '$role[name]', allowed, NULL)) AS '$role[name]',";
        }

        $query = $query . "FROM
                (SELECT CONCAT( security_acl.resource_id, '-', security_acl.privilege_id ) AS id, security_acl.allowed, CONCAT( (
                SELECT userfriendly_name
                FROM security_resources
                WHERE security_acl.resource_id = id), ' - ', (
                SELECT userfriendly_name
                FROM security_privileges
                WHERE security_acl.privilege_id = id) ) AS pravo, security_roles.name AS role
                FROM `security_acl`
                LEFT JOIN `security_roles` ON security_acl.role_id = security_roles.id
                GROUP BY pravo, role) t
                GROUP BY pravo";

        return $this->db->dataSource($query);
    }
?>
Oggy
Člen | 306
+
0
-

děkuju :-)

Oggy
Člen | 306
+
0
-

ještě jen jestli chybu třeba takto uvidíš..

sql dotaz:

<?php
SELECT nazev, bezSpd, spd,
SUM(if( mnozstvi = '2 900 lt', cena, NULL)) AS '2 900 lt',
SUM(if( mnozstvi = '4 500 lt', cena, NULL)) AS '4 500 lt',
SUM(if( mnozstvi = '10 000 lt', cena, NULL)) AS '10 000 lt',
SUM(if( mnozstvi = '20 000 lt', cena, NULL)) AS '20 000 lt',
SUM(if( mnozstvi = '30 000 lt', cena, NULL)) AS '30 000 lt'
FROM
 palivo
LEFT JOIN cenik USING(palivoId)
LEFT JOIN mnozstvi USING(mnozstviId)
WHERE palivo.typ='phm'
GROUP BY nazev
?>

vše vypadá ok.. ale vynechává v posledním sloupci cenu..

výsledek vypadá takhle:

nazev bezSpd spd 2 900 lt 4 500 lt 10 000 lt 20 000 lt 30 000 lt

Avgas 100LL 1 13.71 25.29 25.09 24.69 24.49 NULL

JET A-1 1 10.95 15.25 15.05 14.65 14.45 NULL

PHM BA-95 Natural 0 NULL NULL NULL NULL NULL NULL

PHM Nafta motorová 0 NULL NULL NULL NULL NULL NULL

v posledním sloupci nejsou ceny za množství 30 000 lt ..

samozřejmě v databázi jsou :-)

Editoval Oggy (30. 6. 2010 22:08)

Ani
Člen | 226
+
0
-

Tak takhle to vypada dobre. Ja to delal uz pred nejakou dobou a vim, ze jsem s tim docela bojoval.
Kouknul bych se co vyhodi ten dotaz bez tech sum.

<?php
SELECT nazev, bezSpd, spd
FROM
 palivo
LEFT JOIN cenik USING(palivoId)
LEFT JOIN mnozstvi USING(mnozstviId)
WHERE palivo.typ='phm'
GROUP BY nazev
?>

Editoval Ani (30. 6. 2010 22:21)

Oggy
Člen | 306
+
0
-

Ani napsal(a):

Tak takhle to vypada dobre. Ja to delal uz pred nejakou dobou a vim, ze jsem s tim docela bojoval.
Kouknul bych se co vyhodi ten dotaz bez tech sum.

<?php
SELECT nazev, bezSpd, spd
FROM
 palivo
LEFT JOIN cenik USING(palivoId)
LEFT JOIN mnozstvi USING(mnozstviId)
WHERE palivo.typ='phm'
GROUP BY nazev
?>

vyhodím SUMs ..musím zrušit i ty groupy teda a přdat výpis cen.. a v tom případě vyleze to palivo pětkrát s cenou.. jak mám ..ale při těch SUMs ..jsou tam ceny jen čtyři u páté je NULL

<?php
SELECT nazev, bezSpd, spd, cena

FROM
 palivo
LEFT JOIN cenik USING(palivoId)
LEFT JOIN mnozstvi USING(mnozstviId)
WHERE palivo.typ='phm'
?>
Oggy
Člen | 306
+
0
-

Už vím v čem je problém… pokud je řádek zalomený uvnitř toho porovnání – mnozstvi = ‚30 000 lt‘

takže pokud je konec řádku někde '30 000-TADY- lt'' tak potom je problém.. jak zařídit, aby se kód generovaný dibi nezalomil?

Provizorní řešení:

prostě jsem přidal pár mezer..aby to takto nevyšlo :-) .. ale asi by to bylo k řešení nějak odborněji :-)

Editoval Oggy (30. 6. 2010 22:39)