2 Stimmen

MySQL SELECT WHERE innerhalb der IF-Anweisung

Ich habe eine "group_names" Tabelle, die Benutzergruppen speichert. Jede Gruppe hat einen Manager, der entweder ein einzelner Benutzer sein kann oder von einer anderen Gruppe verwaltet werden kann. Dies wird derzeit durch group_names.mgr_type bestimmt. Ein INT-Wert von 1 bedeutet, dass es sich um einen einzelnen Benutzer handelt, und ein Wert von 2 bedeutet, dass es sich um eine Gruppe handelt, die sie verwaltet.

Zum Beispiel könnte die Gruppe "Allgemeine Benutzer" von der Gruppe "IT-Abteilung" oder von "John Doe" verwaltet werden. Die eindeutigen ID-Felder in den Benutzer- und group_names-Tabellen sind "user_id" und "group_id".

Ich möchte die Logik aus PHP nehmen und einfach in die SQL-Abfrage einfügen, aber hier stoße ich auf Probleme. Ich bin mir nicht sicher, ob dies anhand des Tabellenaufbaus möglich ist oder ob ich einfach nicht in der Lage bin, einfache Anweisungen aus der Dokumentation zu befolgen.

SELECT gn.group_id, gn.group_name, ... gn.mgr_id, CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, usr.user_id,
CASE gn.mgr_type
    WHEN '1' THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1
    WHEN '2' THEN gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1
END AS mgr_name
FROM group_names gn 
LEFT JOIN users usr 
ON gn.created_by=usr.user_id 
ORDER BY group_name ASC;

Ich habe verschiedene Variationen von IF und CASE ausprobiert, mit und ohne Klammern, bekomme aber immer den Fehler "Ungültige Syntax".

...für die richtige Syntax in der Nähe von 'WHERE usr.user_id=gn.mgr_id LIMIT 1) WHEN '2' THEN (gn.group_name WHERE gn' in Zeile 3

Kann ich überhaupt eine andere Zeile aus derselben Tabelle auswählen (den Gruppennamen aus einer anderen Zeile basierend auf mgr_id=group_id auswählen) oder sollte ich eine weitere Tabelle hinzufügen? Haben Sie Vorschläge für eine einfachere/effizientere Methode, dies zu tun?

Danke!

0voto

Yogendra Singh Punkte 33327

Ich denke, du solltest etwas in der Art versuchen (versuche die Bedingungen in den JOIN-Bedingungen eines weiteren Vorkommens der Tabelle zu verschieben):

 SELECT gn.group_id, gn.group_name, ... gn.mgr_id,
        CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, 
        usr.user_id,
       CASE gn.mgr_type
         WHEN '1' THEN CONCAT(usr1.user_firstname,' ',usr1.user_lastname)
         WHEN '2' THEN gn1.group_name
      END AS mgr_name
 FROM group_names gn 
 LEFT JOIN users usr 
 ON gn.created_by=usr.user_id
 RIGHT OUTER JOIN users usr1
 ON usr1.user_id=gn.mgr_id LIMIT 1
 OUTER JOIN group_names gn1
 ON usr.user_id=gn1.mgr_id LIMIT 1
 ORDER BY group_name ASC;

0voto

codingbiz Punkte 25598

Hast du dies schon ausprobiert, seit du bereits zu diesen Tabellen beigetreten bist?

DER FALL gn.mgr_type
    WENN '1' DANN CONCAT(mgr_usr .user_firstname,' ',mgr_usr .user_lastname)
    WENN '2' DANN mgr_grp.group_name
END AS mgr_name

Tatsächlich benötigen Sie noch 2 weitere LEFT JOINs, damit das funktioniert

LEFT JOIN Benutzer mgr_usr 
   ON gn.mgr_id = mgr_usr.user_id 
LEFT JOIN Gruppennamen mgr_grp
   ON gn.mgr_id = mgr_grp.group_id

Linker Join mit der Benutzertabelle, um den Namen des Managers zu erhalten, falls es sich um einen Benutzer handelt, oder Join mit der Tabelle group_names, um den Gruppennamen abzurufen, falls es sich um eine Gruppe handelt

Sie können die JOINs weiter einschränken

LEFT JOIN Benutzer mgr_usr 
   ON gn.mgr_id = mgr_usr.user_id UND gn.mgr_type = 1
LEFT JOIN Gruppennamen mgr_grp
   ON gn.mgr_id = mgr_grp.group_id UND gn.mgr_type = 2

0voto

Seth Battin Punkte 2782

Versuchen Sie es mit:

SELECT ...
CASE WHEN gn.mgr_type = '1' 
    THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1
    ELSE gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1
    END AS mgr_name
FROM group_names gn...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X