Es ist eine ziemlich peinliche Sache, in Worte zu fassen, aber ich möchte die Zeile, wenn der Artikel zuerst zu einem Tarif/Kunden wechselte. Wenn ein Artikel den Kunden wechselt, sollte das Datum des Switch zurückgegeben werden, unabhängig von der Tarifdifferenz. Wenn ein Artikel zwischen Projekten wechselt, darf sich das zurückgegebene Datum nicht ändern, es sei denn, der Tarif des neuen Projekts ist nicht derselbe wie der alte.Erhalte das Datum, an dem ein Feld zum ersten Mal geändert wurde
Nicht ganz sicher, wie ich es klarer machen kann, aber ich bin offen für Vorschläge.
Meine Frage wie folgt aussieht:
SET @id = 1;
SELECT DISTINCT
ip.ItemID,
ip.ProjectID,
p.TariffID,
p.CustomerID,
cs.Date
FROM item_project ip
LEFT JOIN item_project ip1
ON ip.ItemID = ip1.ItemID
AND ip.Date < ip1.Date
LEFT JOIN project p
ON ip.ProjectID = p.ProjectID
LEFT JOIN (
SELECT
ip.ItemID,
ip.Date
FROM item_project ip
LEFT JOIN item_project ip1
ON ip.ProjectID = ip1.ProjectID
AND ip.Date > ip1.Date
LEFT JOIN project p
ON ip.ProjectID = p.ProjectID
WHERE ip.ItemID = @id
AND ip1.ItemID IS NULL
AND p.CustomerID = (
SELECT p.CustomerID
FROM project p
LEFT JOIN item_project ip
ON p.ProjectID = ip.ProjectID
LEFT JOIN item_project ip1
ON ip.ItemID = ip1.ItemID
AND ip.Date < ip1.Date
WHERE ip.ItemID = @id
AND ip1.ItemID IS NULL
)
AND p.TariffID = (
SELECT p.TariffID
FROM project p
LEFT JOIN item_project ip
ON p.ProjectID = ip.ProjectID
LEFT JOIN item_project ip1
ON ip.ItemID = ip1.ItemID
AND ip.Date < ip1.Date
WHERE ip.ItemID = @id
AND ip1.ItemID IS NULL
)
) AS cs
ON ip.ItemID = cs.ItemID
WHERE ip.ItemID = @id
AND ip1.ItemID IS NULL
, die mir gibt
"ItemID","ProjectID","TariffID","CustomerID","Date"
"1","2","1","1","2010-11-10 00:00:00"
, die das falsche Datum
SET @id=2
gibt mir ist:
"2","2","1","1",NULL
Wh ich richtig ist, abgesehen von dem Datum
SET @id=3
gibt mir:
"3","2","1","1",NULL
die auch richtig ist, abgesehen von dem Tag.
Hier ist die Datenbank
CREATE TABLE IF NOT EXISTS `item_project` (
`ID` int(10) unsigned NOT NULL auto_increment,
`ItemID` varchar(10) NOT NULL,
`ProjectID` int(10) unsigned NOT NULL,
`Date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
INSERT INTO `item_project` (`ID`, `ItemID`, `ProjectID`, `Date`) VALUES
(1, '1', 1, '2010-11-05 00:00:00'),
(2, '1', 2, '2010-11-10 00:00:00'),
(3, '1', 3, '2010-11-20 00:00:00'),
(4, '2', 2, '2010-11-21 00:00:00'),
(5, '3', 4, '2010-11-21 00:00:00'),
(6, '3', 2, '2010-11-22 00:00:00'),
(7, '1', 2, '2010-11-23 00:00:00'),
CREATE TABLE IF NOT EXISTS `project` (
`ProjectID` int(10) unsigned NOT NULL auto_increment,
`Name` varchar(45) NOT NULL,
`TariffID` varchar(45) NOT NULL,
`CustomerID` varchar(45) NOT NULL,
PRIMARY KEY (`ProjectID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
INSERT INTO `project` (`ProjectID`, `Name`, `TariffID`, `CustomerID`) VALUES
(1, 'Test', '2', '1'),
(2, 'Another test', '1', '1'),
(3, 'Project1', '1', '1'),
(4, 'Main project', '2', '2');
CREATE TABLE IF NOT EXISTS `tariff` (
`TariffID` int(10) unsigned NOT NULL auto_increment,
`Tariff` varchar(45) NOT NULL,
PRIMARY KEY (`TariffID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
INSERT INTO `tariff` (`TariffID`, `Tariff`) VALUES
(1, 'Tariff 1'),
(2, 'Tariff 2');
bearbeiten: Ein Element kann zu einem alten Tarif oder Kunden zurückgehen. In diesem Fall sollte das angezeigte Datum das Datum sein, an dem dies geschah.
Leider kann ich nicht scheinen, dass dies mit den echten Daten funktioniert. Es funktioniert mit den Testdaten im selben Szenario, also gebe ich dir das Kopfgeld am Ende des Tages, wenn niemand sonst etwas posten kann. –
Bumm. Wenn Sie neue Testdaten posten können, habe ich wahrscheinlich noch Zeit, einen weiteren Lauf zu starten. Vielen Dank. – Riedsio
konnte nicht funktionieren, aber es stellt sich heraus, dass dies in einer separaten Tabelle viel besser wäre, da wir jetzt anscheinend auch historische Daten benötigen. Danke fürs ausprobieren. –