Jörg: Query mysql

Beitrag lesen

Hallo Rolf,

ich verstehe das so, dass die KundenID in Tabelle 1 keine ID-Eigenschaft hat, d.h. es kann dort mehrere Rows mit dieser KundenID geben.

Ganz genau so ist es auch.

Du hast also als ersten Baustein

SELECT kundenid, info1, info2
FROM table1
WHERE /* bedingung */

und bekommst auf diese Weise ein Ergebnis, wo eine KundenID mehrfach vorkommt.

Ja, ok.

Nun frag ich mich: was ist jetzt mit info1, info2, etc? Sind die in dem Fall auch gleich?

Nein, das sind sie nur zum Teil.
Die Tabelle 1 beinhaltet sozusagen Aufträge.
Und da sind zum Teil die Adressen (Kunden hat Adresse gewechselt), Bemerkungen oder auf jeden Fall das Auftragsdatum o.ä. natürlich unterschiedlich.

Wenn nicht, wird es schwierig, denn damit wäre deine Anforderung nicht erfüllbar. Wenn sie aber gleich sind und die KundenID keine ID der Tabelle ist, dann schreit das nach einem Datenmodellfehler, denn dann gehörten info1 und info2 in die Kundentabelle, wo die KundenID eindeutig ist.

Zugegeben, man hätte die Tabelle1 noch weiter normalisieren können.
Aber wirklich müssen?
Es stehen alle Infos zu dem jeweiligen Auftrag einfach in dieser Tabelle.
Also KundenID, Kundennummer, PLZ, Ort, usw.
Und ich finde nicht, dass z.b. die Adresse des Kunden (auf den Auftrag bezogen) in die Kundentabelle gehört. Denn die kann sich ändern und in die Kundentabelle gehört nur die aktuelle Adresse, es sei denn, ich führe eine Adresstabelle, die eine Abhängigkeit zu einer Zeittabelle hat. (Ich habe mich hier für die Datenredundanz entschieden, an anderer Stelle habe ich es auch schon anders gemacht, hat irgendwie beides Vor- und Nachteile).

Hast Du also einen Datenmodellfehler? Oder verstund ich Dich nur miss?

Hm, beides nicht.
Ich glaube nihct an einen Datenmodellfehler.
Tabelle 2 enthält einfach Mitarbeiter des Kunden.
Und ich will nun alle Kunden herausfinden, die in einer gewissen Zeitspanne Aufträge generiert haben und möchte der Vollständigkeit halber alle "gelisteten" Ansprechpartner dieses Kunden ebenfalls aufgeführt haben.

Da es aber Kunden mit 0-n Ansprechpartnern gibt, möchte ich dann je Ansprechpartner eine Ergebniszeile generieren.

Wenn es ein Datenmodellfehler ist, kannst Du dieses SELECT-Ergebnis mit DISTINCT auf eindeutige Werte eindampfen. Das ist nicht schön, weil es unnötig Aufwand in der DB macht, aber ich denke mal, eine Modellsanierung nicht nicht das, was Du jetzt vorhast.

SELECT filter1.kundenid, filter1.info1, filter1.info2, table2.info10, table2.info11
FROM (SELECT DISTINCT kundenid, info1, info2
      FROM table1
      WHERE /* bedingung */) filter1
  LEFT JOIN table2 ON filter1.kundenid = table2.kundenid

wäre mein Versuch, basierend auf den gemachten Annahmen.

Kann ich ausprobieren.
Passt die Query noch auf meinen neuen Versuch, das Datenmodel zu erklären?

Gruß, Jörg