|
[ loonies @ 07.06.2010. 11:27 ] @
| Imam 3 tabele:
Code:
users(id, username)
roles(id, name)
roles_users(user_id, role_id)
Code:
mysql> select id, username from users;
+----+----------+
| id | username |
+----+----------+
| 1 | admin |
| 9 | nema |
| 2 | tester |
| 6 | tester1 |
| 7 | tester2 |
| 8 | tester3 |
+----+----------+
Code:
mysql> select id, name from roles;
+----+-------+
| id | name |
+----+-------+
| 2 | admin |
| 1 | login |
+----+-------+
Code:
mysql> select user_id, role_id from roles_users;
+---------+---------+
| user_id | role_id |
+---------+---------+
| 1 | 1 |
| 7 | 1 |
| 8 | 1 |
| 1 | 2 |
| 2 | 2 |
+---------+---------+
Kako da izlistam korisnike sa statusom, tj da li imaju login role ili ne (login role oznacava da li je korisnik aktivan ili ne)? Dakle treba mi izlaz nesto kao:
Code:
+----+----------+-------+
| id | username | active|
+----+----------+-------+
| 1 | admin | TRUE |
| 9 | nema | FALSE |
| 2 | tester | FALSE |
| 6 | tester1 | FALSE |
| 7 | tester2 | TRUE |
| 8 | tester3 | TRUE |
+----+----------+-------+
Ja sam JOIN-ovao tabele, ali nikako da ubacim status, tj ili imam duplikate ili ako filtriram, onda mi nedostaju korisnici bez login role-a.
|
[ bogdan.kecman @ 07.06.2010. 11:32 ] @
ja sam malo usporen danas - ne kapiram sta pitas?
naveo si username, name i role a trazis status?
[ Tyler Durden @ 07.06.2010. 11:44 ] @
Koliko sam ja skontao ti zelis u slucaju da neko ima role "login" za njegov status ispise false, odnosno nije aktivan.
E sad, to moze samo sa nekim if-om, ako se ne varam.
Ali, nije to problem. Problem je sto mi se ovo cini ne bas najsrecniji dizajn baze..
[ loonies @ 07.06.2010. 12:24 ] @
Citat: Koliko sam ja skontao ti zelis u slucaju da neko ima role "login" za njegov status ispise false, odnosno nije aktivan.
Da!
Dizajn baze je OK, user moze imati vise role-a i role moze biti dodeljen vise user-ima.
Zaboravite onaj izlaz gde je prikazana kolona 'active'. Treba mi ovakav izlaz (da bi bilo jasnije):
Code:
+----+----------+-------+
| id | username | name | (users.id | users.username | roles.name)
+----+----------+-------+
| 1 | admin | login |
| 9 | nema | NULL | (ovaj user nema "prikacen" login role, tj nema referencu preko 'roles_users' pivot tabele)
| 2 | tester | NULL | (ovaj user nema "prikacen" login role, ....)
| 6 | tester1 | NULL | (ovaj user nema "prikacen" login role, ...)
| 7 | tester2 | login |
| 8 | tester3 | login |
+----+----------+-------+
Npr. u ovim primerima, user admin ima 2 role-a: login i admin, ali mene samo interesuje da li ima ili nema login role.
[ djoka_l @ 07.06.2010. 12:52 ] @
Treba ti outer join. Ne znam tačno sintaksu na MySql, ali ovo je po ANSI, pa bi trebalo da prođe (testirano na Oracle)
Code (sql):
CREATE TABLE test_users (id NUMBER, username varchar2(20));
CREATE TABLE test_roles (id NUMBER, name varchar2(20));
CREATE TABLE test_roles_users (user_id NUMBER, role_id NUMBER);
INSERT INTO test_users VALUES (1, 'admin');
INSERT INTO test_users VALUES (9, 'nema');
INSERT INTO test_users VALUES (2, 'tester');
INSERT INTO test_users VALUES (6, 'tester1');
INSERT INTO test_users VALUES (7, 'tester2');
INSERT INTO test_users VALUES (8, 'tester3');
INSERT INTO test_roles VALUES (1, 'login');
INSERT INTO test_roles VALUES (2, 'admin');
INSERT INTO test_roles_users VALUES (1, 1);
INSERT INTO test_roles_users VALUES (7, 1);
INSERT INTO test_roles_users VALUES (8, 1);
INSERT INTO test_roles_users VALUES (1, 2);
INSERT INTO test_roles_users VALUES (2, 2);
SELECT u.id, u.username, rx.name
FROM test_users u LEFT OUTER JOIN (
SELECT ru.user_id, r.name
FROM test_roles_users ru, test_roles r
WHERE r.id = 1
AND ru.role_id = r.id) rx
ON u.id=rx.user_id;
DROP TABLE test_users;
DROP TABLE test_roles;
DROP TABLE test_roles_users;
Rezultat:
Code:
ID USERNAME NAME
1 1 admin login
2 7 tester2 login
3 8 tester3 login
4 6 tester1
5 2 tester
6 9 nema
[ loonies @ 07.06.2010. 13:10 ] @
Pazi kakav prefrigan query...
OUTER JOIN mi ne bi pao na pamet, a takodje nisam znao da kao table reference za JOIN moze da se stavi izlaz SELECT izraza, mislio sam da ide iskljucivo ime tabele.
Hvala!
[ Shinhan @ 08.06.2010. 07:41 ] @
Evo mog predloga:
Code:
SELECT u.username, ru.role_id IS NULL
FROM users AS u
LEFT JOIN roles_users AS ru ON u.id = ru.user_id AND ru.role_id = 1
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|