Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: SQL-Abfrage über mehrere Tabellen

  Alt 5. Jul 2006, 19:58
Sorry, aber davon kann ich leider nicht ausgehen...

Zitat von buyden:
Gehen wir also davon aus dass statistik.auftrag der Fremdschlüssel zu auftrag.auftragid ist und somit ne n:1-Beziehnung besteht.
weil statistik.auftrag vom Typ VARCHAR ist und auftrag.auftragid ein BIGINT ist.

Das geht so nicht, oder etwa doch? Ist ja MySQL, da weiss man nie.

Edit...
So habe mir nochmal Gedanken gemacht...

Warum ist bei dir die Auftragsnummer nicht in der Auftragstabelle? Die sollte sich doch nicht pro Status ändern können oder?

Folgende Tabellenstruktur würde ich vorschlagen:
SQL-Code:
CREATE TABLE `auftrag` (
  `auftragID` int(10) unsigned NOT NULL auto_increment,
  `auftragnummer` varchar(10) NOT NULL default '',
  PRIMARY KEY (`auftragID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `status` (
  `StatusID` int(10) unsigned NOT NULL auto_increment,
  `TagFrist` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY (`StatusID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `auftrag_status` (
  `StatistikID` int(10) unsigned NOT NULL auto_increment,
  `AuftragID` int(10) unsigned NOT NULL default '0',
  `StatusID` int(10) unsigned NOT NULL default '0',
  `Techniker` varchar(10) NOT NULL default '',
  `Datum` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY (`StatistikID`),
  KEY `FK_auftrag_status_1` (`AuftragID`),
  KEY `FK_auftrag_status_2` (`StatusID`),
  CONSTRAINT `FK_auftrag_status_2` FOREIGN KEY (`StatusID`) REFERENCES `status` (`StatusID`),
  CONSTRAINT `FK_auftrag_status_1` FOREIGN KEY (`AuftragID`) REFERENCES `auftrag` (`auftragID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Wenn du in das Datum als Default einen Timestamp machen lässt, wird automatisch das aktuelle Datum+Zeit in die Spalte Datum geschrieben, wenn ein Datensatz in die Datenbank eingetragen wird.
Dann brauchst du das nicht in deiner Anwendung beachten.

Mit folgender Anweisung kommst du dann an die letzte Auftragsbearbeitung, wenn die Frist, die sich auf den aktuellsten Statuscode bezieht, den aktuellen Tag überschritten hat. So hat man die ganze Geschichte eines Auftrags in der Datenbank, da brauch kein Eintrag geändert zu werden, wenn schon am selben Tag ein Datensatz besteht.

SQL-Code:
SELECT *
FROM auftrag a
INNER JOIN auftrag_status x
  ON a.auftragID = x.auftragID
INNER JOIN status s
  ON x.statusID = s.statusID
WHERE datum = (SELECT MAX(datum)
               FROM auftrag_status
               WHERE auftragID = a.auftragID)
  AND DATE(NOW()) > DATE(DATE_ADD(datum, INTERVAL tagfrist DAY))
Ich habe das mit MySQL5 getestet. Sollte aber auch mit 4.1 gehen.

Gruss
Thorsten
  Mit Zitat antworten Zitat