Abfrageproblematik mit MySQL

Davicito

Erfahrenes Mitglied
Hallo liebes Community,

ich habe eine Frage zu einem Select-Problem.

ich habe eine Tabelle: Mitarbeiter (M_ID, und personalien), eine Tabelle: Kunden und eine Tabelle: Standort
Dazu giebt es die Relationstabelle: Bez_Kunden_Mitarbeiterin dem Mitarbeiter in relation von Kunden und dessen Standort gesetzt werden.

S. Bild - Relationale DB - Kurzübersicht
1548692297272.png
s. Bild - mit Beispieldaten
1548696496330.png

Problemstellung:
Ich möchte mir alle Mitarbeiter anzeigen lassen, die ausgeschieden sind. Sprich nur die Mitarbeiter, wo ein Austrittsdatum, in Tabelle: MAChronik gesetzt ist und falls der Mitarbeiter mehrere Rekords besitzt, muss dazu geprüft werden, das dazu auch kein Rekord mit Austritt NULL oder '000-00-00' definiert ist.

Mit folgendem SQL-Satemant werden mir dazu leider auch alle mit offenem Austritt angezeigt, wie kann man das realisierun, dass zu einer M_ID alle Rekorts geprüft werden (vielleich mit einer Loop) das der Mitarbeiter auch wirklich ausgeschieden ist?

MySQL:
SQL:
SELECT  *
FROM Mitarbeiter m
LEFT JOIN Bez_Kunden_Mitarbeiter bkm ON m.M_ID = bkm.M_ID
LEFT JOIN MAChronik mac ON m.M_ID = mac.M_ID
WHERE  bkm.STGruppen_ID = '1'
     AND mac.Austritt = (SELECT  max(mac2.Austritt)
                                        FROM MAChronik mac2
                                        WHERE  mac2.M_ID = m.M_ID)
     AND (mac.Austritt is not null OR mac.Austritt != "0000-00-00" OR mac.Austritt < "2019-01-28")

GROUP BY bkm.M_ID
ORDER BY m.Name ASC

Ich freu mich über etwas Hilfe bei diesem Thema und Danke es Euch schon im Voraus.
Liebe Grüße!
 
Zuletzt bearbeitet:
Als erste Idee:
Achtung: Aircode!
SQL:
SELECT A.M_ID, A.Gesamt, B.Gefiltert, B.MAXAustritt FROM
(SELECT M_ID, COUNT(*) AS Gesamt FROM MAChronik GROUP BY M_ID) AS A,
(SELECT M_ID, COUNT(*) AS Gefiltert, MAX(Austritt) AS MAXAustritt  FROM MAChronik WHERE Austritt IS NOT NULL AND Austritt<>'0000-00-00' AND Austritt<'2019-01-28' GROUP BY M_ID) AS B
WHERE
A.M_ID=B.M_ID AND
A.Gesamt=B.Gefiltert
bzw. als INNER JOIN darstellen
EDIT: Habs mit deinen Daten für MAChronik in Access gestestet, und ich erhalte M_ID 8 und 77 geliefert mit dem jeweils höchsten Austrittsdatum
 
Zuletzt bearbeitet:
Hab gerade noch was bei dir gesehen: Check noch mal deine Primary/Foreign Keys.
Ich sehe da Paarungen, bei welchen einer unsigned hat, der andere nicht
(Beispiel Mitarbeiter.M_ID ist unsigned, MAChronik.M_ID nicht)
 
Als erste Idee:
Achtung: Aircode!
SQL:
SELECT A.M_ID, A.Gesamt, B.Gefiltert, B.MAXAustritt FROM
(SELECT M_ID, COUNT(*) AS Gesamt FROM MAChronik GROUP BY M_ID) AS A,
(SELECT M_ID, COUNT(*) AS Gefiltert, MAX(Austritt) AS MAXAustritt  FROM MAChronik WHERE Austritt IS NOT NULL AND Austritt<>'0000-00-00' AND Austritt<'2019-01-28' GROUP BY M_ID) AS B
WHERE
A.M_ID=B.M_ID AND
A.Gesamt=B.Gefiltert
bzw. als INNER JOIN darstellen
EDIT: Habs mit deinen Daten für MAChronik in Access gestestet, und ich erhalte M_ID 8 und 77 geliefert mit dem jeweils höchsten Austrittsdatum
Hallo Danke für die Hilfestellung.
Ich habe das einmal bei mir ausprobiert und siehe da, er zeigt mir nur weniger an, die auch wirklich ausgeschieden sind, als vorher.
Da habe ich noch eine weitere Frage zu Ihrem Select. Wie kann ich diesen jetzt mit meiner Select-Abfrage kombilieren?
Ich habe ja nun noch zwei Joins über die Tabelle Mitarbeiter und Bez_Kunden_Mitarbeiter, welche auch berücksichtigt werden müssen. Ich benötige als Rückgabe nun auch noch den Vornamen, Nachnamen etc. der/des Mitarbeiter/s.
Muss ich Ihren Select als Sub-Query in dem Join für MAChronik formulieren, oder wie baue ich den am besten? Bei meinen Versuchen bekomme ich immer Fehlermeldungen weil er die Attribute nicht gefunden werden können (z.B. m.M_ID).

Beste Grüße
 
Hi Davicito,

Wird (was mich betrifft) warten müssen, da ich das nur im Büro machen kann.
Hab jetzt Feierabend (bin auf dem iPad), und morgen und übermorgen habe ich Kundendienst.
Vielleicht kann dir jemand anderes von hier bis dahin weiter helfen.
Ich komme frühestens (wenn überhaupt) morgen Nachmittag dazu, mir das an zu schauen
 
Hi Davicito,

Wird (was mich betrifft) warten müssen, da ich das nur im Büro machen kann.
Hab jetzt Feierabend (bin auf dem iPad), und morgen und übermorgen habe ich Kundendienst.
Vielleicht kann dir jemand anderes von hier bis dahin weiter helfen.
Ich komme frühestens (wenn überhaupt) morgen Nachmittag dazu, mir das an zu schauen
Ah ok. Vielen Dank erstmal. Vielleicht etwas später. Ich schau auch nochmal, ob ich das allein hinbekommen, sonst würde ich mich gern über einen Tipp freuen.

Beste Dank im Voraus! :)
 
Kurze Frage: kannst du Bespieldaten der betroffenen Tabellen (als CSV oder text in ZIP) hier reinstellen?
Wäre deutlich einfacher für mich (oder jemand anderst)
 
Ungetestet!

SQL:
SELECT  *
FROM Mitarbeiter AS m
LEFT JOIN
Bez_Kunden_Mitarbeiter AS bkm
ON m.M_ID = bkm.M_ID
LEFT JOIN
(SELECT A.M_ID, A.Gesamt, B.Gefiltert, B.MAXAustritt FROM
(SELECT M_ID, COUNT(*) AS Gesamt FROM MAChronik GROUP BY M_ID) AS A,
(SELECT M_ID, COUNT(*) AS Gefiltert, MAX(Austritt) AS MAXAustritt  FROM MAChronik WHERE Austritt IS NOT NULL AND Austritt<>'0000-00-00' AND Austritt<'2019-01-28' GROUP BY M_ID) AS B
WHERE
A.M_ID=B.M_ID AND
A.Gesamt=B.Gefiltert) AS mac
ON
m.M_ID = mac.M_ID
WHERE  bkm.STGruppen_ID = '1'
GROUP BY bkm.M_ID
ORDER BY m.Name ASC
 
Hallo Zvoni,

super vielen Dank. Es hat zwar lange gedauert, eine Antwort zu formulieren, aber lieber spät als nie. ^^

Der MySQL Code scheint zu funktionieren und gibt mir tatsächlich alle ausgeschiedenen Mitarbeiter zurück.
Nun habe ich aber noch ein paar Verständisfragen zu diesem genialem Code.

Wenn ich jetzt aus der Tabelle "MAChronik" die PersonalNr haben will, habe ich bisher im globalen Select-Query "mac.Personal" zu stehen. Nur bekomme ich dazu eine Fehlermeldung das dieses Attribute nicht bekannt ist. Jedoch steht im letzen Inner-Join ein alias "mac" für die Unerabfragen in der MAChronik-Tabelle.
Muss ich hier im ersten SubQuery - im Select-Bereich - A.PersonalNr / B.PersonalNr schreiben damit er mir die PersonalNr zurückgeben kann? Bei mir hat das nähmlich so nicht funktioniert. Jedoch mit einem zusätzlichen Inner-Join (s. vorletzer Join, der auskommentiert ist), konnte ich mir das Attribute "mac.PersonalNr" zurückgeben.
Und meine zweite Frage, gibt es da vielleicht noch eine bessere Variante zur besseren Performance oder vielleicht der bnesseren Übersichtlichkeit und Verständlichkeit?

Hier mein umgeschriebener/angepasster MySQL-Code
SQL:
SELECT m.M_ID, m.Telefon_1, Telefon_2, m.Email, m.Benutzername, 
            CONCAT_WS(", ", m.Name, m.Vorname) as name, a.Anrede, mac.PersonalNr, 
            br.Group_Color, br.Rolle, mag.Kürzel as gkürzel, mag.Gruppe 
FROM Mitarbeiter m 

INNER JOIN Anrede a on m.A_ID = a.A_ID 
LEFT JOIN Benutzerrolle br on m.BR_ID = br.BR_ID 
INNER JOIN Bez_MAGruppe bmag on m.M_ID = bmag.M_ID 
INNER JOIN MAGruppe mag on bmag.MAG_ID = mag.MAG_ID 
INNER JOIN Bez_Kunden_Mitarbeiter bkm on m.M_ID = bkm.M_ID
#INNER JOIN MAChronik mac on m.M_ID = mac.M_ID

INNER JOIN 
    (SELECT A.M_ID, A.Gesamt, B.Gefiltert, B.MAXAustritt 
       FROM (SELECT M_ID, COUNT(*) AS Gesamt 
                FROM MAChronik GROUP BY M_ID) AS A,
            (SELECT M_ID, COUNT(*) AS Gefiltert, MAX(Austritt) AS MAXAustritt  
                FROM MAChronik 
                WHERE Austritt IS NOT NULL AND Austritt<>'0000-00-00' AND Austritt<'2019-10-14' 
                GROUP BY M_ID) AS B
       WHERE A.M_ID = B.M_ID 
         AND A.Gesamt=B.Gefiltert ) AS mac
ON m.M_ID = mac.M_ID

Where bkm.STGruppen_ID = 1 

GROUP BY bkm.M_ID 
ORDER BY m.Name ASC
 
Zurück