Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odczytywanie praw dostępu bez zdublowanych rekordów
Forum PHP.pl > Forum > Bazy danych > MySQL
Jarod
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.
kukoc
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)
Jarod
@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 smile.gif
kukoc
sorry nie wiem tak na szybko... smile.gif
Jarod
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);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.