Autor | Zpráva | ||
---|---|---|---|
maks Profil |
#1 · Zasláno: 25. 8. 2010, 01:07:32
Ahoj,
mám 3 tabulky, ty jsou následující: groups id | name 1 | Admin 2 | User settings id | name 1 | Přidat stránku 2 | Editace stránky 3 | Přidat novinku ... permissions id | group_id | setting_id 1 | 1 | 1 2 | 1 | 2 3 | 1 | 3 4 | 2 | 1 5 | 2 | 3 A na výstupu bych chtěl křížovou tabulku, která bude následující (místo 1 a 0 budou checkboxy, ale to nevadí): Název | Admin | User ---------------------------------------- Přidat stránku | 1 | 1 Editovat stránku | 1 | 0 Přidat novinku | 1 | 1 Prozatím jsem sesmolil tento dotaz, ale není to úplně ono (teda vůbec ne :-)) - jsou to sloupce, jež potřebuji vybrat, teď bych k tomu potřeboval dopsat kouzelnou formulku, která mi umožní udělat na výpisu tabulku tak, jak uvádím výše. SELECT t1.id, t1.name, t2.id, t2.group_id, t2.setting_id, t3.id, t3.name FROM settings t1 JOIN permissions t2 ON t1.id = t2.setting_id JOIN groups t3 ON g.id = t2.group_id Děkuji za pomoc. |
||
Kajman_ Profil * |
#2 · Zasláno: 25. 8. 2010, 08:46:25
Co si v php nachystat pro každou tabulku pole s daty. Pak si udělat něco jako
vypis hlavicku 'Název' forech uzivatele vypis hlavicku se jmenem foreach settings vypis nazev a udelej forech uzivatele koukni zda ma pravo v poli permissions a podle toho vypis jednicku nebo nulu |
||
PostCC Profil |
#3 · Zasláno: 25. 8. 2010, 08:54:36
maks:
Myslím, že takto křížově to v rámci jednoho selectu udělat nepůjde. Můžete nicméně rozšířit výběr o sloupec "Group" a pak např. v PHP sestavit požadovaný výstup. V každém případě výsledkem selectu: SELECT S.Name AS Nazev, G.Name AS User, P.Id IS NOT NULL AS Permission FROM Settings AS S CROSS JOIN Groups AS G LEFT JOIN Permissions AS P ON S.Id = P.Setting_Id AND G.Id = P.Group_Id ORDER BY S.Id, G.Id budou všechny požadované kombinace, výsledek bude vypadat takto: +-----------------+-------+------------+ | Nazev | User | Permission | +-----------------+-------+------------+ | Přidat stránku | Admin | 1 | | Přidat stránku | User | 1 | | Editace stránky | Admin | 1 | | Editace stránky | User | 0 | | Přidat novinku | Admin | 1 | | Přidat novinku | User | 1 | +-----------------+-------+------------+ |
||
Taps Profil |
#4 · Zasláno: 25. 8. 2010, 09:02:03
maks:
můžeš se zkusit inspirovat http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#105 |
||
maks Profil |
#5 · Zasláno: 25. 8. 2010, 09:34:25
PostCC:
s daty ve tvaru, jaký jsi udělal ty (asi) neudělám tabulku, jakou jsem napsat já v prvním příspěvku. Taps: díky za tip, podívám se, třeba tam bude něco užitečného :-) Kajman: třemi dotazy jsem to měl teď, ale nepřišlo mi úplně košér vypisovat jednu tabulku třemi dotazy. Ale když to říkáš i ty, ... :-) Děkuji všem, maks |
||
PostCC Profil |
#6 · Zasláno: 25. 8. 2010, 10:17:02
maks:
Fakt ne? Co třeba tohle: $Query = "SELECT S.Name AS Nazev, G.Name AS User, P.Id IS NOT NULL AS Permission FROM Settings AS S CROSS JOIN Groups AS G LEFT JOIN Permissions AS P ON S.Id = P.Setting_Id AND G.Id = P.Group_Id ORDER BY S.Id, G.Id"; $Result = $DB->Query($Query); $RowCounter = 0; $TableContent = NULL; $TableHeader = ""; $LastPermission = NULL; While($Row = $DB->FetchAssoc($Result)) { If($LastPermission != $Row["Nazev"]) $RowCounter++; If($RowCounter == 1) { $TableHeader .= $LastPermission ? NULL : " <td>Název</td>".PHP_EOL; $TableHeader .= " <td>".HtmlSpecialChars($Row["User"])."</td>".PHP_EOL; } If($Row["Nazev"] != $LastPermission) { $TableContent .= $TableContent ? " </tr>".PHP_EOL : NULL; $TableContent .= " <tr>".PHP_EOL; $TableContent .= " <td>".HtmlSpecialChars($Row["Nazev"])."</td>".PHP_EOL; } $TableContent .= " <td>".HtmlSpecialChars($Row["Permission"])."</td>".PHP_EOL; $LastPermission = $Row["Nazev"]; } $Output = "<table>".PHP_EOL. " <tr>".PHP_EOL. $TableHeader. " </tr>".PHP_EOL. $TableContent. ($TableContent ? " </tr>".PHP_EOL : NULL). "</table>".PHP_EOL; Echo $Output; Pořád je to jenom jeden select... |
||
maks Profil |
#7 · Zasláno: 25. 8. 2010, 10:32:04
PostCC:
člověče, smekám (a omlouvám se)... :-) |
||
Kajman_ Profil * |
#8 · Zasláno: 25. 8. 2010, 10:59:06
maks:
„nepřišlo mi úplně košér vypisovat jednu tabulku třemi dotazy“ Někdy to může být srovnatelné nebo i rychlejší. http://php.vrana.cz/srovnani-dotazu-do-zavislych-tabulek.php V tomhle případě bude hodně záležet na skutečných datech v tabulkách - tipnul bych, že někdy může být rychlejší jeden dotaz a zpracování dle PostCCa, jindy může být rychlejší původní řešení s třemi dotazy. |
||
maks Profil |
#9 · Zasláno: 25. 8. 2010, 12:04:11
Kajman:
„V tomhle případě bude hodně záležet na skutečných datech v tabulkách“ dat bude málo: počet skupin bude v řádu jednotek, v tabulce "settings" bude cca do 50 řádků, v poslední tabulce tak bude počet řádků v řádu menších stovek (součin dvou předchozích). Dat tedy bude minimum, na rychosti to poznat nepůjde - i proto mě zajímalo, jestli to půjde shrnout do jednoho dotazu. O tom, že někdy více dotazů může být rychlejších, vím. |
||
Časová prodleva: 14 let
|
0