ugrás a tartalomhoz

MySQL - user jogok összegyűjtése

inf · 2009. Május. 9. (Szo), 01.46
Sziasztok!

A felhasználók jogait egy összekötő táblában tárolom, ami az users és a rights táblákat köti össze, és a neve user_rights.
Az user táblában található adatok alapján megkapom az uid-t, és ezzel lekérdezem az user_rights-ból, hogy a felhasználónak milyen jogai vannak, majd a rights táblából az rid alapján kikeresem, hogy a jogok milyen kategóriákba, és a kategórián belül milyen folyamathoz tartoznak.

A lényeg, hogy a végeredményben az uid-t és a jogokat összegyűjtve szeretném megkapni.
Ez megy is nagyjából az alábbi kóddal:

SELECT user_rights.uid,user_rights.access,rights.controller,rights.action
	FROM user_rights INNER JOIN rights
		ON user_rights.rid=rights.rid
		AND user_rights.uid IN 
			(SELECT uid FROM users WHERE email='cim##kukac##gmail.com' AND password='blah')
A kimenete valami ilyesmi:

uid	|	controller	|	action	|	access
1	|	article		|	write	|	1
1	|	article		|	update	|	1
1	|	users		|	read	|	1
.
.
.
Arra lennék kíváncsi, hogy lehetséges e olyan sql-el, hogy az összes jogot összeszedjem valamilyen tömbben, vagy stringben, hogy csak egy mezőt foglaljanak el, mert nekem kicsit zavaró, hogy minden sor elején ott van az uid, meg persze majd az uid-n kívül mást is szeretnék majd még odatenni.
 
1

GROUP_CONCAT

Poetro · 2009. Május. 9. (Szo), 01.53
GROUP_CONCAT
2

Kösz

inf · 2009. Május. 12. (K), 23.57
Hálás köszönetem, pont ez hiányzott! Nem gondoltam volna, hogy ilyet is tud..

Ilyen lett:

SELECT
  user_rights.uid,
  GROUP_CONCAT(user_rights.access) AS access,
  GROUP_CONCAT(rights.controller) AS controller,
  GROUP_CONCAT(rights.action) AS action
FROM user_rights JOIN rights
  ON user_rights.rid=rights.rid
	AND user_rights.uid IN
		(SELECT uid FROM users WHERE email='cim##kukac##gmail.com' AND password='pw')
GROUP BY user_rights.uid
Időközben módosult ilyenre:

SELECT
	users.uid,
	users.name,
	GROUP_CONCAT(user_rights.access) AS access,
	GROUP_CONCAT(rights.controller) AS controller,
	GROUP_CONCAT(rights.action) AS action
FROM user_rights 
	JOIN users ON
		user_rights.uid=users.uid 
		AND users.email='aaaa##kukac##gmail.com' 
		AND users.password='bbbb'
	JOIN rights ON
		user_rights.rid=rights.rid
GROUP BY users.uid
Sajnos nem vágom annyira az SQLt, hogy el tudjam dönteni, hogy ez most a lehető legoptimálisabb megoldás, vagy sem.
Azt még egyelőre nem tisztáztam, hogy kellenek e az users tábla mezői, vagy sem. Egyelőre csak egy login tesztet írok.

(Az első átlagban 13,5 msec-et, a második meg 14,5 msec-et produkált, szóval olyan vészesen sok különbség nincs a kettő között.)