erik s.
Erfahrenes Mitglied
Hallo,
ich sitze gerade mal wieder über den schönen JOINs, die MySQL so zu bieten hat und wollte mittels eines reellen Beispiels üben. Nun tut sich mir aber bei meinem Beispiel gleich noch ein anderes Problem auf, dessen ich mich bisher auch noch nicht annehmen musste.
Mein Beispiel-Problem handelt von drei Tabellen: artikel, umsatz und vertreter. Allzu bekannt aus einigen Tutorials. Die Tabelle umsatz dient quasi als Zwischentabelle der Auflösung der m:n-Beziehung zwischen artikel und vertreter (ein Artikel kann von mehreren Vertretern verkauft worden sein, ein Vertreter kann aber auch mehrere Artikel verkauft haben).
Als ersten Query habe ich einen erstellt, der mir heraussucht, an welchen Tagen welche Artikel nicht verkauft wurden. Funktioniert auch wirklich gut und ist logisch ;-)
Nun kann es ja vorkommen, dass an manchen Tagen gar nichts verkauft wird, zu diesen Tagen gibt es dann auch logischerweise keine Datensätze in der umsatz-Tabelle (Feiertage vernachlässige ich der Einfachheit halber).
Wie kann ich die Abfrage
also durch eine künstlich erzeugte ersetzen, die meinetwegen alle Daten vom 2010-01-01 bis 2010-06-30 als Zeilen enthält? Geht das überhaupt?
Zur Erläuterung der Abfrage oben:
Zuerst erzeuge ich eine Abfrage, in der jede mögliche Datum-Artikel-Kombination vorkommt (hier: natürlich nur die Daten, die in der umsatz-Tabelle stehen <- Problem). Dann kombiniere ich die Ergebnistabelle mittels LEFT JOIN mit der umsatz-Tabelle wobei hier die Datensätze mit Umsatz herausgefiltert werden. Was übrig bleibt sind die Datum-Artikel-Kombinationen, die quasi nicht stattgefunden haben.
Hoffe, irgendjemand versteht mich
Gruß,
Erik
EDIT: Ich sehe gerade, dass das Thema bei den Relationalen Datenbanksystemen besser aufgehoben wäre ...
ich sitze gerade mal wieder über den schönen JOINs, die MySQL so zu bieten hat und wollte mittels eines reellen Beispiels üben. Nun tut sich mir aber bei meinem Beispiel gleich noch ein anderes Problem auf, dessen ich mich bisher auch noch nicht annehmen musste.
Mein Beispiel-Problem handelt von drei Tabellen: artikel, umsatz und vertreter. Allzu bekannt aus einigen Tutorials. Die Tabelle umsatz dient quasi als Zwischentabelle der Auflösung der m:n-Beziehung zwischen artikel und vertreter (ein Artikel kann von mehreren Vertretern verkauft worden sein, ein Vertreter kann aber auch mehrere Artikel verkauft haben).
Code:
artikel:
------------
id int(11)
bezeichnung varchar(50)
preis decimal(10,2)
umsatz:
------------
id int(11)
artikel_id int(11)
vertreter_id int(11)
menge int(11)
datum date
vertreter:
-------------
id int(11)
name varchar(50)
Als ersten Query habe ich einen erstellt, der mir heraussucht, an welchen Tagen welche Artikel nicht verkauft wurden. Funktioniert auch wirklich gut und ist logisch ;-)
PHP:
$sql = "SELECT DATE_FORMAT(E.datum, \"%d.%m.%Y\") AS datum,E.id,E.bezeichnung " .
"FROM " .
"(SELECT C.datum, D.id, D.bezeichnung " .
"FROM " .
"(SELECT DISTINCT A.datum " .
"FROM umsatz AS A) AS C," .
"(SELECT B.id, B.bezeichnung " .
"FROM artikel as B) AS D) AS E " .
"LEFT JOIN umsatz AS U " .
"ON E.datum = U.datum AND E.id = U.artikel_id " .
"WHERE U.datum IS NULL " .
"ORDER BY E.datum, E.id";
Nun kann es ja vorkommen, dass an manchen Tagen gar nichts verkauft wird, zu diesen Tagen gibt es dann auch logischerweise keine Datensätze in der umsatz-Tabelle (Feiertage vernachlässige ich der Einfachheit halber).
Wie kann ich die Abfrage
Code:
SELECT DISTINCT A.datum ...
Zur Erläuterung der Abfrage oben:
Zuerst erzeuge ich eine Abfrage, in der jede mögliche Datum-Artikel-Kombination vorkommt (hier: natürlich nur die Daten, die in der umsatz-Tabelle stehen <- Problem). Dann kombiniere ich die Ergebnistabelle mittels LEFT JOIN mit der umsatz-Tabelle wobei hier die Datensätze mit Umsatz herausgefiltert werden. Was übrig bleibt sind die Datum-Artikel-Kombinationen, die quasi nicht stattgefunden haben.
Hoffe, irgendjemand versteht mich

Gruß,
Erik
EDIT: Ich sehe gerade, dass das Thema bei den Relationalen Datenbanksystemen besser aufgehoben wäre ...
Zuletzt bearbeitet: