[Need Help] MySQL Query

Ach man , ich bekomms net hin. Hab jetzt echt serh viel versucht.

Hatte das:

PHP:
$sql = 'select
			um_rights.id as rightsid,
			um_rights.rightname,
			um_rights.php_id,
			um_users.id as userid,
			um_users.username,
			um_groups.id as groupid,
			um_groups.groupname as groupname
		from 
			um_rights as r
			
		left join um_groups_rights
			on um_groups_rights.groups_id=um_groups.id
		left join um_rights
			on um_groups_rights.rights_id=um_rights.id
		
		left join um_rights as r1
			on um_users_rights.rights_id=r1.id
		left join um_users as u1
			on um_users_rights.users_id=u1.id
			
		where
			um_groups.id > 1 AND 
			um_users.id > 1 AND 
			um_rights.id > 1
			
		order by 
			um_groups.groupname ASC, 
			um_users.username ASC,
			um_rights.rightname ASC';

dann wurde mir immer gesagt "unknown table", dann hab ich noch viele tables eingefügt:

PHP:
$sql = 'select
			um_rights.id as rightsid,
			um_rights.rightname,
			um_rights.php_id,
			um_users.id as userid,
			um_users.username,
			um_groups.id as groupid,
			um_groups.groupname as groupname
		from 
			um_rights as r,
			um_users_rights as ur1,
			um_users_rights as ur2,
			um_users,
			um_groups,
			um_users_rights
			
		left join um_groups_rights
			on um_groups_rights.groups_id=um_groups.id
		left join um_rights
			on um_groups_rights.rights_id=um_rights.id
		
		left join um_rights as r1
			on um_users_rights.rights_id=r1.id
		left join um_users as u1
			on um_users_rights.users_id=u1.id
			
		where
			um_groups.id > 1 AND 
			um_users.id > 1 AND 
			um_rights.id > 1
			
		order by 
			um_groups.groupname ASC, 
			um_users.username ASC,
			um_rights.rightname ASC';

So, und nun dauert mein Script etwa 7sekunden, und dann hab ich mega mega viele ergebnisse, also irgendwas stimmt da net :/
 
habs nun noch so versucht:

PHP:
$sql = 'select
			um_rights.id as rightsid,
			um_rights.rightname,
			um_rights.php_id,
			um_users.id as userid,
			um_users.username,
			um_groups.id as groupid,
			um_groups.groupname as groupname
		from 
			um_rights as r,
			um_users_rights as ur,
			um_users u,
			um_groups g,
			um_users_groups ug,
			
		where
			g.id > 1 AND 
			u.id > 1 AND 
			r.id > 1 AND
			(
			  (
				ur.users_id = u.id AND
				ur.rights_id = r.id			  
			  )
			  OR
			  (
				u.id = ug.users_id AND
				ug.groups_id = g.id
			  )
			  OR
			  (
				1 = 1
			  )
			) 
		order by 
			g.groupname ASC, 
			u.username ASC,
			r.rightname ASC
			';

auch net, un ich weiß einfach nicht, woran es liegt :/
 
Ich habe anhand Deines Dump (welcher nicht der Grafik entspricht) mal ein Query getestet, welches Du analog zu dem anderen Query mit PHP auslesen kannst:
Code:
select
  um_rights.id as rightId,
  substr(um_rights.rightname,1,13) as rightname,
  um_groups.id as groupId,
  um_groups.groupname,
  um_users.id as userId,
  um_users.username
from um_rights
left join um_groups_rights
  on um_groups_rights.rights_id=um_rights.id
left join um_groups
  on um_groups_rights.groups_id=um_groups.id
left join um_users_rights
  on um_users_rights.users_id=um_rights.id
left join um_users
  on um_users_rights.users_id=um_users.id
#where ...>1 hier einfügen
order by 
  um_rights.id ASC, 
  um_groups.groupname ASC,
  um_users.username ASC
Gruß hpvw

PS: Auch in zusammengesetzten Worten, wie Standardrecht, schreibt man Standard mit "d".
 
Hm, danke erstmal. Ja ich weiß, die Keys und Tabellennamen entsprechend nicht ganz meiner Grafik, aber das ist ja nicht weiter schlimm, da ich die Queries zumindest umbauen kann, wenn ihr die nach der Grafik gestaltet. Habe nun noch die Where > 1 Dinger rausgelassen, und irgendwie kommt mir die Abfrage nicht ganz richtig vor.

Also ich baue mir wie folgt das Array auf:

PHP:
while($row = mysql_fetch_assoc($res)) {
	#print_r($row);
	
	$k = $row['rightid'].'||'.$row['rightname'];
	
	if(!isset( $new[ $k ]['groups'] ) || !is_array( $new[ $k ]['groups'] ))
		$new[ $k ]['groups'] = array();
	if(!isset( $new[ $k ]['users'] ) || !is_array( $new[ $k ]['users'] ))	
		$new[ $k ]['users'] = array();
	
	if( !in_array($row['username'], $new[ $k ]['users'] ) )
		$new[ $k ]['users'][] = $row['username'];
	
	if( !in_array($row['groupname'], $new[ $k ]['groups'] ) )
		$new[ $k ]['groups'][] = $row['groupname'];
	
}

Also als Index der ersten Ebene nehme ich halt die Rechteid, und darunter lege ich 2 Arrays an: eines, in dem ich die User speicher und eins, in dem ich die Gruppen speicher.

So. aber wenn ich dann halt print_r($new) mache, dann habe ich folgende Ausgabe:

Code:
Array
(
    [1||standartrecht - do not delete!] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                )

            [users] => Array
                (
                    [0] => admin
                )

        )

    [2||eigene einstellungen bearbeiten!] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [3||gruppen anlegen] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => User3
                )

        )

    [4||gruppen löschen] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [5||gruppen editieren] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [6||user erstellen] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [7||user löschen] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [8||user editierren] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                    [3] => gruppe2
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [9||rechte erstellen] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                    [3] => gruppe2
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [10||rechte löschen] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                    [3] => gruppe2
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [11||rechte editieren] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [12||scripteinstellungen bearbeiten] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [13||datenbankbackup anlegen] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => asdasd
                    [2] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )

    [14||asd] => Array
        (
            [groups] => Array
                (
                    [0] => admin
                    [1] => gruppe1
                )

            [users] => Array
                (
                    [0] => 
                )

        )
)

Stimmt auch fast, was aber nicht ganz richtig ist (oder sehe ich das nun falsch!?):
Der User "User3" sollte nicht hier: "3||gruppen anlegen" vertreten sein :confused:Jedoch sollte er hier: "14||asd" vertreten sein. Und der User "Admin" sollte dort auch vertreten sein :)

Nur was mich wundert: der Rest ist richtig. Was ist da nun falsch!?
 
Du hast Recht, da hat sich ein kleiner Cut'n'Paste-Fehler eingeschlichen:
Code:
select
  um_rights.id as rightId,
  substr(um_rights.rightname,1,13) as rightname,
  um_groups.id as groupId,
  um_groups.groupname,
  um_users.id as userId,
  um_users.username
from um_rights
left join um_groups_rights
  on um_groups_rights.rights_id=um_rights.id
left join um_groups
  on um_groups_rights.groups_id=um_groups.id
left join um_users_rights
  on um_users_rights.rights_id=um_rights.id
left join um_users
  on um_users_rights.users_id=um_users.id
#where um_groups.id=1
order by 
  um_rights.id ASC, 
  um_groups.groupname ASC,
  um_users.username ASC
 
Wow thx :)
Mega respekt ;) Find ich echt mega geil von dir dankeeeeeeeeeeeeeeee

Noch eine Frage:
Warum verwendest du das substr() beim Select? Man kann doch den vollen Rechtenamen selektieren oder?

Noch eine kleine Frage: wenn jetzt ein Recht nciht vertreten ist (also keine Gruppe oder kein User das Recht hat), dann wird das Recht garnicht erwähnt ... Kann man das irgendwie so ändern, dass praktisch die Gruppen und die User, die die Rechte besitzten sozusagen "optional" sind :) ? Es könnten ja von mir aus auch 2 Queries sein. Solange es nicht mehr als 3 werden ;)
 
Zuletzt bearbeitet:
firstlord18 hat gesagt.:
Warum verwendest du das substr() beim Select? Man kann doch den vollen Rechtenamen selektieren oder?
Natürlich kann man das. Ich hatte das im MySQL-Command-Line-Client getestet. Da der als "DOS-Fenster" nur 80 Zeichen pro Zeile hat, wurde die Tabellendarstellung gesprengt.

firstlord18 hat gesagt.:
Noch eine kleine Frage: wenn jetzt ein Recht nciht vertreten ist (also keine Gruppe oder kein User das Recht hat), dann wird das Recht garnicht erwähnt ... Kann man das irgendwie so ändern, dass praktisch die Gruppen und die User, die die Rechte besitzten sozusagen "optional" sind :) ? Es könnten ja von mir aus auch 2 Queries sein. Solange es nicht mehr als 3 werden ;)
Das Query selbst selektiert das schon richtig. Allerdings muss auch der PHP-Code das entsprechende Array-Element anlegen.
Als zweites in der Schleife, nach der Bestimmung von $k, würde ich Folgendes machen:
PHP:
//...
    if(!isset( $new[ $k ] )) {
        $new[ $k ] = array('groups'=>array(),'users'=>array());
    }
//...
Die folgenden zwei Abfragen müsstest Du Dir dann sparen können.
Eigentlich dürfte das aber nicht das Problem sein. Vielleicht liegt es ja auch beim Auslesen des Arrays.

Gruß hpvw
 
seltsam, ich habe mir in der Schleife per print_r($row) alles ausgeben lassen, bei mir wird nur das selektiert, wo entweder User oder Gruppe vertreten sind :/
 

Neue Beiträge

Zurück