PHP MYSQL LEFT JOIN gibt nicht alle Daten aus

du-doch-nicht

Banned
Registriert
Juni 2014
Beiträge
9
Hallo, ich versuche gerade alle Daten über LEFT JOIN auszugeben.

Die Haupttabelle ist "`auftraege_druckjobs`" die mit der "`kontakte`"-Tabelle verknüpft wird um den Druckauftrag einen Kunden zuzuordnen. Nun sollen auch die Druckdateien "`auftraege_druckdateien`" (können mehrere sein) bei der Auflistung mit eingebunden werden. Diese werden gezählt und gruppiert.

Da nicht zu jedem Druckauftrag Dateien vorliegen, soll der Auftrag trotzdem angezeigt werden.
Genau hier liegt das Problem. Bei der Ausgabe wird nur ein Kunde mit 0 Druckdateien ausgegeben und die 2 weiteren nicht, bei denen auch noch keine Druckdateien vorhanden sind, wo liegt da der Fehler?


Datenbank

`kontakte`
Code:
------------+--------
kd_id (AI)  | kd_name
------------+--------
1           | Firma 1
2           | Firma 2
3           | Firma 3
4           | Firma 4
------------+--------

`auftraege_druckjobs`
Code:
------------+-----------+------------+------------+------------
dj_id (AI)  | dj_kd_id  | dj_status  | dj_termin  | dj_sichtbar
------------+-----------+------------+------------+------------
1           | 2         | 1          | 2018-01-01 | 1
2           | 1         | 0          | 2017-12-28 | 1
3           | 3         | 2          | 2017-12-20 | 1
4           | 3         | 1          | 2017-12-21 | 1
5           | 5         | 2          | 2018-01-01 | 1
------------+-----------+------------+------------+------------

`auftraege_druckdateien`
Code:
----------------------------------
da_id (AI)  | da_dj_id  | da_datei
------------+-----------+---------
1           | 1         | Datei 1
2           | 1         | Datei 2
3           | 1         | Datei 3
4           | 2         | Datei 1
------------+-----------+---------


MySQL:
PHP:
SELECT
	*, COUNT(`da`.`da_dj_id`) AS `AnzahlDaten`
FROM
	`auftraege_druckjobs` AS `dj`
LEFT JOIN
	`kontakte` AS `kd`
ON
	`kd`.`kd_id` = `dj`.`dj_kd_id`
LEFT JOIN
	`auftraege_druckdateien` AS `da`
ON
	`da`.`da_dj_id` = `dj`.`dj_id`
WHERE
	`dj`.`dj_sichtbar` = '1'
GROUP BY
	`da`.`da_dj_id`
ORDER BY
	`dj`.`dj_termin` DESC


Ausgabe:
HTML:
Firma 2     + 3 Druckdateien    01.01.2018     1
Firma 1     Datei 1             28.12.2017     0
Firma 3     NULL                20.12.2017     2

Fehlende Ausgabe:
HTML:
Firma 3     NULL                21.12.2017     1
Firma 4     NULL                01.01.2018     2


Warum werden die letzten beiden Kunden nicht ausgegeben?
 
- SELECT * und GROUP BY verträgt sich nicht. Alle diejenigen Spalten in SELECT stecken, die dann im Ergebnis auftauchen sollen und diese dann in GROUP BY wiederholen. Davon ausgenommen sind NUR die aggregierten Spalten.

- Aufträge_Druckjobs ordnet Kunden #5 einen Druckjob zu; wenn das lt Deiner Aussage später eine "Firma 4" sein soll, stimmt die Zuordnung oder potentiell etwas anderes nicht.

Wenn ich das richtig lese brauchst Du auch zumindest für Kontakte <> Aufträge_Druckjobs einen INNER JOIN. Es sei denn natürlich, Du hättest Kunden-IDs ohne zugehörigen Kunden oder Kunden ohne Kunden-ID.

Dann kannst Du mit dem OUTER JOIN kommen und für jede Spalte in Auftrag_Druckjobs den zugehörigen Eintrag im eben erstellten JOIN dranfügen, bzw NULL falls es keinen gab.
 
RalphS schrieb:
- Aufträge_Druckjobs ordnet Kunden #5 einen Druckjob zu; wenn das lt Deiner Aussage später eine "Firma 4" sein soll, stimmt die Zuordnung oder potentiell etwas anderes nicht.

Hallo RalphS,
da habe ich mich bei dem 5ten Druckjob vertan, ist natürlich die id von "Firma 4".

Die Abfrage werde ich dementsprechend umbauen. Wenn "GROUP BY" nicht optimal ist, wie kann ich stattdessen die Druckjobs, die mehrere Druckdateien haben in der Liste zusammenfügen?


Hab jetzt auf die schnelle "COUNT" und "GROUP BY" entfernt.

MySQL:
PHP:
SELECT
	*
FROM
	`auftraege_druckjobs` AS `dj`
LEFT JOIN
	`kontakte` AS `kd`
ON
	`kd`.`kd_id` = `dj`.`dj_kd_id`
LEFT JOIN
	`auftraege_druckdateien` AS `da`
ON
	`da`.`da_dj_id` = `dj`.`dj_id`
WHERE
	`dj`.`dj_sichtbar` = '1'
ORDER BY
	`dj`.`dj_id` ASC

Ausgabe:
Code:
Firma 2     Datei 2     01.01.2018     1
Firma 2     Datei 1     01.01.2018     1
Firma 2     Datei 3     01.01.2018     1
Firma 1     Datei 1     28.12.2017     0
Firma 3                 20.12.2017     2
Firma 3                 20.12.2017     1
Firma 4                 01.01.2018     2


Gruß
 
Zuletzt bearbeitet:
Lies dir Post #2 nochmal durch. Wenn du gruppieren und die Dateien zählen willst, ist GROUP BY zu verwenden völlig ok.
Du musst aber anders gruppieren, denn was passiert, ist folgendes: überall, wo keine Datei vorhanden ist, ist `da`.`da_dj_id` = NULL (durch den LEFT JOIN). Jetzt gruppiert du darauf und alle Datensätze ohne Datei werden zu einem gruppiert. Welcher da übrig bleibt, ist wohl Zufall... Im MS SQL Server z.B. ist solch eine Abfrage deshalb gar nicht erlaubt.

Eine vernünftige Gruppierung beinhaltet alle Spalten, die auch im Select vorkommen. In deinem Fall dürfte es aber schon helfen, in deiner ursprünglichen Abfrage das
Code:
GROUP BY
	`da`.`da_dj_id`

in das

Code:
GROUP BY
	`dj`.`dj_id`

zu ändern.
 
Zurück
Oben