Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Odczytywanie praw dostępu bez zdublowanych rekordów, Problem z średnio skomplikowanym zapytaniem
Jarod
post
Post #1





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


Chciałbym otrzymać: account_id, login, password, blocked, expired, nazwy wszystkich grup do których należy użytkownik i wszystkie role z tych poszczególnych grup (bez powtórzeń). Jak to zrobić?

Kombinuje tak ale może da się inaczej/szybciej...
  1. SELECT account_id, login, password, blocked, expired, group_name, role_name FROM accounts INNER JOIN accounts_groups USING(account_id) INNER JOIN groups_roles USING(group_id) INNER JOIN groups USING(group_id) INNER JOIN roles USING (role_id);



A tutaj gotowa struktura bazy do testów:
Cytat
Kod wycięty, poprawiony i kompletny poniżej.


Ten post edytował Jarod 18.04.2007, 19:35:56
Go to the top of the page
+Quote Post
kukoc
post
Post #2





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 17.04.2007
Skąd: Polska

Ostrzeżenie: (0%)
-----


wlasnie jestem na etapie tworzenia praw dostepu dla mojej zabawki, i mniej wiecej ten sam problem mi sie pojawil, troche sie uhahałem z tym ale tu masz rozwiazanie

pomogla ekipa z kanalu #php.pl


  1. SELECT accounts.account_id, login, password, blocked, expired,
  2. GROUP_CONCAT(DISTINCT group_name) AS 'grupy' , GROUP_CONCAT(DISTINCT role_name) AS 'role'
  3. FROM groups_roles, roles, accounts_groups, accounts, groups
  4.  
  5. WHERE groups_roles.role_id = roles.role_id AND groups_roles.group_id = accounts_groups.group_id AND accounts.account_id = accounts_groups.account_id AND groups.group_id = accounts_groups.group_id
  6.  
  7. GROUP BY accounts_groups.account_id


swoja droga w zrzucie tabel brakowalo ci roli13, co troszeczke mnie zmylilo (takie 15 min kombinowania)

Ten post edytował kukoc 17.04.2007, 14:32:39
Go to the top of the page
+Quote Post
Jarod
post
Post #3





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


@kukoc: wielkie dzięki bo to nie dawało mi spokoju - już myślałem że jest to nie możliwe i chciałem kombinować z podzapytaniami (raczej mało wydajne).

Mam jeszcze jedno pytanie: wiesz jak to przerobić na JOIN?

Tak czy inaczej masz wirtualnego browca (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kukoc
post
Post #4





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 17.04.2007
Skąd: Polska

Ostrzeżenie: (0%)
-----


sorry nie wiem tak na szybko... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Jarod
post
Post #5





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


Problem podobny jak wcześniej tylko, że dochodzi nam tablica z parametrami. Dla konta jas powinno się otrzymać wynik:

Kod
jas | fsola | 0 | NULL | Grupa2, Grupa3 | Role7,Role8(3),Role10,Role12, Role7,Role8(5),Role10,Role12 |



Jak napisać takie zapytanie? Poniżej pełny kod SQL - wystarczy wkleić do mysql
  1. CREATE DATABASE acl;
  2. USE acl;
  3.  
  4. CREATE TABLE sessions
  5. (
  6. session_id INT NOT NULL AUTO_INCREMENT,
  7. session_identifier CHAR(32) NOT NULL,
  8. session_time_start DATETIME NOT NULL,
  9. session_last_time DATETIME NOT NULL,
  10. address_ip VARCHAR(15) NOT NULL,
  11. login VARCHAR(30),
  12. session_values TEXT,
  13. UNIQUE(session_identifier),
  14. PRIMARY KEY(session_id)
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  16.  
  17.  
  18. CREATE TABLE groups
  19. (
  20. group_id INT NOT NULL AUTO_INCREMENT,
  21. group_name VARCHAR(30) NOT NULL,
  22. group_description VARCHAR(60) NOT NULL,
  23. PRIMARY KEY(group_id)
  24. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  25.  
  26.  
  27. CREATE TABLE roles
  28. (
  29. role_id INT NOT NULL AUTO_INCREMENT,
  30. role_name VARCHAR(30) NOT NULL,
  31. role_description VARCHAR(60) NOT NULL,
  32. PRIMARY KEY(role_id)
  33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  34.  
  35.  
  36. CREATE TABLE parameters
  37. (
  38. parameter_id INT NOT NULL AUTO_INCREMENT,
  39. parameter_name VARCHAR(30) NOT NULL,
  40. PRIMARY KEY(parameter_id)
  41. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  42.  
  43.  
  44. CREATE TABLE accounts
  45. (
  46. account_id INT NOT NULL AUTO_INCREMENT,
  47. login VARCHAR(20) NOT NULL,
  48. password CHAR(40) NOT NULL,
  49. blockade BOOLEAN NOT NULL DEFAULT false,
  50. password_update DATE,
  51. UNIQUE(login),
  52. PRIMARY KEY(account_id)
  53. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  54.  
  55.  
  56. CREATE TABLE accounts_groups
  57. (
  58. account_id INT NOT NULL,
  59. group_id INT NOT NULL,
  60. INDEX(account_id),
  61. INDEX(group_id),
  62. CONSTRAINT fkey_accounts_groups_account_id FOREIGN KEY(account_id) REFERENCES accounts(account_id),
  63. CONSTRAINT fkey_accounts_groups_group_id FOREIGN KEY(group_id) REFERENCES groups(group_id)
  64. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  65.  
  66.  
  67. CREATE TABLE groups_roles
  68. (
  69. group_id INT NOT NULL,
  70. role_id INT NOT NULL,
  71. INDEX(group_id),
  72. INDEX(role_id),
  73. CONSTRAINT fkey_groups_roles_group_id FOREIGN KEY(group_id) REFERENCES groups(group_id),
  74. CONSTRAINT fkey_groups_roles_role_id FOREIGN KEY(role_id) REFERENCES roles(role_id)
  75. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  76.  
  77.  
  78. CREATE TABLE groups_roles_parameters
  79. (
  80. group_id INT NOT NULL,
  81. role_id INT NOT NULL,
  82. parameter_id INT NOT NULL,
  83. INDEX(group_id),
  84. INDEX(role_id),
  85. INDEX(parameter_id),
  86. CONSTRAINT fkey_groups_roles_parameters_group_id FOREIGN KEY(group_id) REFERENCES groups(group_id),
  87. CONSTRAINT fkey_groups_roles_parameters_role_id FOREIGN KEY(role_id) REFERENCES roles(role_id),
  88. CONSTRAINT fkey_groups_roles_parameters_parameter_id FOREIGN KEY(parameter_id) REFERENCES parameters(parameter_id)
  89. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97. INSERT INTO groups VALUES(NULL, 'Grupa1', 'Opis1');
  98. INSERT INTO groups VALUES(NULL, 'Grupa2', 'Opis2');
  99. INSERT INTO groups VALUES(NULL, 'Grupa3', 'Opis3');
  100. INSERT INTO groups VALUES(NULL, 'Grupa4', 'Opis4');
  101.  
  102.  
  103. INSERT INTO roles VALUES(NULL, 'Role1', 'Opis1');
  104. INSERT INTO roles VALUES(NULL, 'Role2', 'Opis2');
  105. INSERT INTO roles VALUES(NULL, 'Role3', 'Opis3');
  106. INSERT INTO roles VALUES(NULL, 'Role4', 'Opis4');
  107. INSERT INTO roles VALUES(NULL, 'Role5', 'Opis5');
  108. INSERT INTO roles VALUES(NULL, 'Role6', 'Opis6');
  109. INSERT INTO roles VALUES(NULL, 'Role7', 'Opis7');
  110. INSERT INTO roles VALUES(NULL, 'Role8', 'Opis8');
  111. INSERT INTO roles VALUES(NULL, 'Role9', 'Opis9');
  112. INSERT INTO roles VALUES(NULL, 'Role10', 'Opis10');
  113. INSERT INTO roles VALUES(NULL, 'Role11', 'Opis11');
  114. INSERT INTO roles VALUES(NULL, 'Role12', 'Opis12');
  115. INSERT INTO roles VALUES(NULL, 'Role13', 'Opis13');
  116.  
  117.  
  118. INSERT INTO parameters VALUES(NULL, '*');
  119. INSERT INTO parameters VALUES(NULL, 'param1');
  120. INSERT INTO parameters VALUES(NULL, 'param2');
  121. INSERT INTO parameters VALUES(NULL, 'param3');
  122. INSERT INTO parameters VALUES(NULL, 'param4');
  123. INSERT INTO parameters VALUES(NULL, 'param5');
  124. INSERT INTO parameters VALUES(NULL, 'param6');
  125. INSERT INTO parameters VALUES(NULL, 'param7');
  126.  
  127.  
  128. INSERT INTO accounts VALUES(NULL, 'admin', 'pass', 0, NULL);
  129. INSERT INTO accounts VALUES(NULL, 'jas', 'fasola', 0, NULL);
  130. INSERT INTO accounts VALUES(NULL, 'ptasiek', 'maly', 0, NULL);
  131. INSERT INTO accounts VALUES(NULL, 'mod', 'mod', 0, NULL);
  132.  
  133.  
  134. INSERT INTO accounts_groups VALUES(1, 1);
  135. INSERT INTO accounts_groups VALUES(2, 2);
  136. INSERT INTO accounts_groups VALUES(2, 3);
  137. INSERT INTO accounts_groups VALUES(3, 2);
  138. INSERT INTO accounts_groups VALUES(3, 3);
  139. INSERT INTO accounts_groups VALUES(3, 4);
  140. INSERT INTO accounts_groups VALUES(4, 2);
  141. INSERT INTO accounts_groups VALUES(4, 3);
  142. INSERT INTO accounts_groups VALUES(4, 4);
  143.  
  144.  
  145. INSERT INTO groups_roles VALUES(1, 1);
  146. INSERT INTO groups_roles VALUES(1, 2);
  147. INSERT INTO groups_roles VALUES(1, 3);
  148. INSERT INTO groups_roles VALUES(1, 4);
  149. INSERT INTO groups_roles VALUES(1, 5);
  150. INSERT INTO groups_roles VALUES(1, 6);
  151. INSERT INTO groups_roles VALUES(1, 7);
  152. INSERT INTO groups_roles VALUES(1, 8);
  153. INSERT INTO groups_roles VALUES(1, 9);
  154. INSERT INTO groups_roles VALUES(1, 10);
  155. INSERT INTO groups_roles VALUES(1, 11);
  156. INSERT INTO groups_roles VALUES(1, 12);
  157. INSERT INTO groups_roles VALUES(1, 13);
  158. INSERT INTO groups_roles VALUES(2, 7);
  159. INSERT INTO groups_roles VALUES(2, 8);
  160. INSERT INTO groups_roles VALUES(2, 10);
  161. INSERT INTO groups_roles VALUES(2, 12);
  162. INSERT INTO groups_roles VALUES(3, 7);
  163. INSERT INTO groups_roles VALUES(3, 8);
  164. INSERT INTO groups_roles VALUES(3, 10);
  165. INSERT INTO groups_roles VALUES(3, 12);
  166. INSERT INTO groups_roles VALUES(4, 7);
  167. INSERT INTO groups_roles VALUES(4, 8);
  168. INSERT INTO groups_roles VALUES(4, 10);
  169. INSERT INTO groups_roles VALUES(4, 12);
  170. INSERT INTO groups_roles VALUES(4, 13);
  171.  
  172.  
  173. INSERT INTO groups_roles_parameters VALUES(1, 2, 8);
  174. INSERT INTO groups_roles_parameters VALUES(1, 4, 8);
  175. INSERT INTO groups_roles_parameters VALUES(1, 5, 8);
  176. INSERT INTO groups_roles_parameters VALUES(1, 8, 8);
  177. INSERT INTO groups_roles_parameters VALUES(1, 13, 8);
  178. INSERT INTO groups_roles_parameters VALUES(2, 8, 3);
  179. INSERT INTO groups_roles_parameters VALUES(3, 8, 5);
  180. INSERT INTO groups_roles_parameters VALUES(4, 13, 7);
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 16:21