PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL Abfrage, JOIN-Problem



tr0nix
10.08.2007, 10:15
Hallo zusammen

Ich bin am tüfteln einer Userverwaltung (siehe Bildattachment). Jetzt möchte ich ein Statement absetzen können, welches mir den User, dessen Primäre Gruppe und die Sekondäre Gruppe anzeigt - am liebsten natürlich mit deren Namen. Aktuell kriege ich es nur hin, dass mir die sekondären Gruppen als Nummern angezeigt werden. Ist es möglich, dies auch noch aufzulösen?

Ich weiss ich könnte theoretisch auch über die usergroups Tabelle mit einem weiteren Attribut regeln, ob die Gruppe primär oder sekondär ist, aber mir gefällts so irgendwie besser (gibt dafür wohl auch mehr Probleme).

Das habe ich bisher:

select `user_name` as `users`, `grou_name` as `primary`, `ref_group_gid` as `secondary` from `user`
left join `group` on `user`.`user_gid` = `group`.`grou_gid`
left join `usergroups` on `user`.`user_uid` = `usergroups`.`ref_user_uid`;

Gibt folgendes aus:


+----------+----------+-----------+
| users | primary | secondary |
+----------+----------+-----------+
| root | root | 1 |
| root | root | 2 |
| root | root | 3 |
| root | root | 4 |
| root | root | 5 |
| root | root | 6 |
| root | root | 7 |
| root | root | 8 |
| root | root | 9 |
| root | root | 12 |
| daemon | other | 2 |
| daemon | other | 4 |
| bin | bin | 3 |
| sys | sys | NULL |
| adm | adm | 3 |
| adm | adm | 7 |
| adm | adm | 8 |
| uucp | uucp | NULL |
| nuucp | nuucp | NULL |
| dladm | sys | NULL |
| smmsp | smmsp | NULL |
| listen | adm | NULL |
...

floyd62
12.08.2007, 00:56
Hi tr0nix,

denke man sollte das mit einem zusätzlichen Join etwa so lösen können:



select distinct user.user_name "users", g1.group_name "primary", g2.group_name "secondary"
from user
left join `group` g1 on (user.user_gid = g1.group_gid)
left join `usergroups` on (user.user_uid = usergroups.ref_user_uid)
left join `group` g2 on (usergroups.ref_group_gid = g2.group_gid)
;


Das Ganze natürlich ungetestet und ohne Garantie ... :D

Grüße

tr0nix
12.08.2007, 10:56
Cool danke, ich probiers morgen gleich mal aus :).

tr0nix
13.08.2007, 08:33
Chapeau! Hat geklappt!


mysql> select distinct user.user_name "users", g1.grou_name "primary", g2.grou_name "secondary" from user left join `group` g1 on (user.user_gid = g1.grou_gid) left join `usergroups` on (user.user_uid = usergroups.ref_user_uid) left join `group` g2 on (usergroups.ref_group_gid = g2.grou_gid);
+----------+----------+-----------+
| users | primary | secondary |
+----------+----------+-----------+
| root | root | other |
| root | root | bin |
| root | root | sys |
| root | root | adm |
| root | root | uucp |
| root | root | mail |
| root | root | tty |
| root | root | lp |
| root | root | nuucp |
| root | root | daemon |
| daemon | other | bin |
| daemon | other | adm |
| bin | bin | sys |
| sys | sys | NULL |
| adm | adm | sys |
| adm | adm | tty |
| adm | adm | lp |
| uucp | uucp | NULL |
| nuucp | nuucp | NULL |
| dladm | sys | NULL |
| smmsp | smmsp | NULL |
| listen | adm | NULL |
| gdm | gdm | NULL |
| lp | lp | NULL |
| webservd | webservd | NULL |
| postgres | postgres | NULL |
| a378570 | other | NULL |
| mysql | mysql | NULL |
| nobody | nobody | NULL |
| noaccess | noaccess | NULL |
| nobody4 | nogroup | NULL |
+----------+----------+-----------+

Danke vielmals! Jetzt nur noch das SQL fertig verstehen :).

saeckereier
16.08.2007, 01:00
Chapeau! Hat geklappt!
Danke vielmals! Jetzt nur noch das SQL fertig verstehen :).

Falls ernst gemeint, g1 und g2 wirken in dem Statement als wären sie zwei getrennte Tabellen in der DB die zufällig den gleichen Inhalt haben. Deshalb kannst du g1 mit der prim. ID und g2 mit der sek. ID verknüpfen. Sollte man sich merken, eines der Standardrezepte in SQL.

tr0nix
16.08.2007, 08:36
Prima danke! Ich hab bisher nur mit lowlevel SQL rumgepanscht auf der DB.. hat immer ausgereicht. Aber wollts mal "richtig" gelernt haben.