[ 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