Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Izlistaj sve korisnike sa statusom (aktivan/neaktivan) iz m:n relacije

  • 6 odgovora
  • 3.034 pregleda

Najnovija ↓

Izlistaj sve korisnike sa statusom (aktivan/neaktivan) iz m:n relacije 07.06.2010. u 12:27 · pre 199 meseci #1
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.
Potpis
And all you touch and all you see
Is all your life will ever be
---Δ==

Neugodna istina - reaguj! | Linux is not Windows
Re: Izlistaj sve korisnike sa statusom (aktivan/neaktivan) iz m:n relacije 07.06.2010. u 12:44 · pre 199 meseci #3
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..
Potpis
Beneath civilization's fragile crust, cold chaos churns...
Re: Izlistaj sve korisnike sa statusom (aktivan/neaktivan) iz m:n relacije 07.06.2010. u 13:24 · pre 199 meseci #4
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.

Potpis
And all you touch and all you see
Is all your life will ever be
---Δ==

Neugodna istina - reaguj! | Linux is not Windows
Re: Izlistaj sve korisnike sa statusom (aktivan/neaktivan) iz m:n relacije 07.06.2010. u 13:52 · pre 199 meseci #5
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    

Re: Izlistaj sve korisnike sa statusom (aktivan/neaktivan) iz m:n relacije 07.06.2010. u 14:10 · pre 199 meseci #6
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!
Potpis
And all you touch and all you see
Is all your life will ever be
---Δ==

Neugodna istina - reaguj! | Linux is not Windows
Re: Izlistaj sve korisnike sa statusom (aktivan/neaktivan) iz m:n relacije 08.06.2010. u 08:41 · pre 199 meseci #7
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
Potpis
"Common sense is not so common." - Voltaire
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme