výpis z datbáze do „matice“
- Oggy
- Člen | 306
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
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
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
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
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
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)