[MySQL] GROUP BY entfernt welchen eintrag?

sachsd87

Grünschnabel
Hallo,

Ich habe mir eine Datenbank (MySQL 5.5) aufgebaut mit mehreren Tabellen.
Daraus habe ich mir eine View erzeugt die jetzt als Beispiel "UserOne" heisst und wie folgt aussieht:

Hostname | Permission
---------------------------------------
blatt | RO
wald | RW
wiese | RO
blume | RW
wald | RO
wiese | RW


Jetzt hätte ich gerne das die doppelten Hostname einträge rausfallen und die höchste Permission, wenn vorhanden, erhalten bleibt...

Zunächst habe ich gedacht ich sortiere nach Permissions mit DESC und mache danach nochmal einen SELECT mit GROUP BY auf den Hostname, aber leider schmeißt er irgendwie zufällig die Einträge raus ...

Ist das überhaupt möglich das man bei Group by eine reihenfolge angeben kann welche eintraege rausgeworfen werden sollen?

Vielen dank schonmal fuer eure Hilfe

Gruesse sachsd87
 
Hey
  1. "und die höchste Permission, wenn vorhanden, erhalten bleibt..." wie definierst du was die höchste Permission ist?
  2. Poste einfach mal dein SQL deiner View. Ansonsten wird es schwierig dir zu helfen....
 
Hi, Danke schonmal für deine Antwort.

Zu 1.: Zur Zeit gibt es nur 2 Berechtigungen: "RW" = Read/Write und "RO" = Read only, also ich die höchste Permission "RW" und wenn ich absteigend mit "DESC" sortiere hab ich die höchste Berechtigung oben stehen und dachte dann an noch einen SELECT der dann mittels GROUP BY von oben die Tabelle durch geht und dann rauswirft, allerdings macht er das so nicht und es bleiben trotzdem "RO" einträge stehen obwohl ein "RW" eintrag von dem Hostname vorhanden ist.

Zu 2.: Ich bin erst morgen wieder an dem Rechner mit dem SQL Code aber ich versuche es mal zu rekonstruieren:

SQL:
CREATE VIEW UserOne AS SELECT Server.Hostname, Roles.Permission 
FROM User, User_to_Role, Roles, Server_to_Role, Server WHERE 
User.ID=(SELECT ID FROM User WHERE Username='UserOne') AND 
User.ID=User_to_Role.U_ID AND User_to_Role.R_ID=Roles.ID AND 
Roles.ID=Server_to_Role.R_ID AND Server_to_Role.S_ID=Server.ID ORDER BY Roles.Permission DESC;

und dann nochmal ein SELECT:

SQL:
SELECT * FROM UserOne GROUP BY Hostname;

Und die Tabellen die ich habe sind:

Server:
ID | Hostname

Roles:
ID | Rolename | Permission

User:
ID | Username

User_to_Role:
U_ID | R_ID

Server_to_Role:
S_ID | R_ID


wobei User_to_Role und Server_to_Role die Beziehungstabellen sind um User und Server mit den Rollen zu verknüpfen

Und danke euch, falls noch etwas unklar ist, bitte anmerken :)
 
SQL:
WHERE
USER.ID=(SELECT ID FROM USER WHERE Username='UserOne')
Warum brauchst du hier eine subquery? Du hast ja schon die user Tabelle in der Query.

SQL:
ORDER BY Roles.Permission DESC;
Order by in einem View SQL bringt dir nichts. Wichtig ist dann eher, dass du beim Select von der View evtl. order by verwendest.

und dann nochmal ein SELECT:

SQL:
SELECT * FROM UserOne GROUP BY Hostname;
Also ich nehme mal an dass dieses select auch noch Teil des selects der view ist? Jedenfalls ist bei einem solchen select klar dass nichts passiert. Du verwendest ja im Zusammenhang mit group by auch keine Aggregatsfunktion.

Aber man könnte in deinem Fall tatsächlich group by zusammen mit max verwenden:
SQL:
CREATE VIEW userone AS
SELECT
    s.hostname,
    MAX(r.permission) AS permission
FROM
    USER u
INNER JOIN
    user_to_role ur
ON u.id = ur.u_id
INNER JOIN
    ROLES r
ON ur.r_id = r.id
INNER JOIN
    server_to_role sr
ON r.id = sr.r_id
INNER JOIN
    server s
ON sr.s_id = s.id
WHERE
    u.username = 'UserOne'
GROUP BY
    s.hostname;
 
super, vielen dank für deine Mühe... ich wusste nicht das man die Aggregatsfubktionen auch auf Zeichen anwenden kann. Geht er dann nach Alphabet vor ?

Mit dem Subquery haste recht ... weiss nich warum ich so blöd war das so einzubauen ^^
und order by hatte ich nur drin um es vor dem Group by zu sortieren, was ja aber nicht nötig ist weil die max()-funktion das erledigt

Vielen Vielen Dank :)
 
Zurück