[MySQL] Versuch mit Joins

k3nguruh

Erfahrenes Mitglied
Hallo,

hier mal mein Problem....

Tabelle Mitglieder (fw_mem_daten) (pid => PRIMARY, AUTO_INCREMENT)

Code:
pid | vorname | nachname | abteilung
 1  | th....  | fir..... |     1
 2  | al....  | sch..... |     2
 3  | pf....  | do...... |     1


Tabelle Dienstplan (fw_dienst_plan) (id => PRIMARY, AUTO_INCREMENT)

Code:
id | abteilung | beginndatum          | enddatum
 1 |     1     | 2011-01-01 08:00:00  | 2011-01-01 16:00:00
 2 |     1     | 2011-01-02 08:00:00  | 2011-01-02 16:00:00


Tabelle Dienstteilnahme (fw_dienst_teilnahme) (id = id von fw_dienst_plan, pid = pid von fw_mem_daten)

Code:
id | pid | teilnahme
 1 |  1  | anwesend
 1 |  2  | anwesend
 1 |  3  | entschuldigt
 2 |  1  | anwesend
 2 |  3  | anwesend


Wie man hierraus hoffentlich ersehen kann, war die PID 2 zum Zeitpunk des Dienstes von ID 1 noch in der ABTEILUNG 1. Irgendwann danach muss dieser dann die Abteilung gewechselt haben.

Was möchte ich jetzt eigentlich haben?

Es sollen erstmal alle PIDs angezeigt werden die (noch) in ABTEILUNG 1 sind. Desweiteren sollen auch die PIDs angezeigt werden, die in der Dienstteilnahme drinstehen, egal in welcher Abteilung sie sich jetzt befinden.
Es sollen auch nicht alle Dienstteilnahmen ausgegeben werden sondern nur die übermittelt werden. Zum Bsp. wären das jetzt nur die ID 1 und 2


PHP:
SELECT md.pid, CONCAT( md.nachname, ', ', md.vorname ) AS mitglied, dt.id
FROM fw_mem_daten AS md
LEFT JOIN fw_dienst_teilnahme AS dt ON md.pid = dt.pid
AND (
dt.id
IN ( 1, 2 )
)
ORDER BY mitglied

Gibt mir alle Mitglieder aus. bei der ID wird mit NULL aufgefüllt, wenn kein Eintrag gefunden wurde. Also erstmal alles richtig.
Wie bekomme ich jetzt noch die Einschränkung hin, dass er mir wo die ID NULL ist, nur Mitglieder der Abteilung 1 ausgegeben werden?

geht das überhaubt mit joins?
 
item: dt.id IN ( 1, 2 ) gehört in ein WHERE-Teil und nicht in den JOIN-Teil

item: die Einschränkung der dt.id würde ich in ein Subquery schreiben. Es erleichtert nachher die verschiedenen Bedinungen auszubändeln

item: Der WHERE-Teil muss nun berücksichtigen: Alle mit id NULL und Abteilung 1, sowie alle die eine ID haben. Das gibt eine AND-Verknüpfung für den ersten Teil und dann noch beide Teile mit einem OR zusammenhängen

SQL:
SELECT 
	md.pid, 
	CONCAT( md.nachname, ', ', md.vorname ) AS mitglied, 
	dt.id
FROM 
	fw_mem_daten AS md
	LEFT JOIN (
			SELECT id
			FROM fw_dienst_teilnahme
			WHERE id IN (1,2)
		) AS dt 
		ON md.pid = dt.pid
WHERE
	(
		dt.id IS NULL 
		AND md.abteilung = 1
	) OR (
			NOT dt.is IS NULL
	)
ORDER BY
	mitglied
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück