Autor Zpráva
maks
Profil
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 *
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
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
maks:
můžeš se zkusit inspirovat http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#105
maks
Profil
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
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
PostCC:
člověče, smekám (a omlouvám se)... :-)
Kajman_
Profil *
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
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.

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