C'est une chose assez étrange à mettre en mots, mais je veux la ligne quand l'article est passé pour la première fois à un tarif/client. Si un article change de client, la date du commutateur doit être retournée, quelle que soit la différence de tarif. Si un élément change de projet, la date retournée ne doit pas changer, sauf si le tarif du nouveau projet n'est pas le même que l'ancien.Récupère la date à laquelle un champ a été modifié pour la première fois à sa valeur actuelle
Je ne sais pas trop comment je peux le rendre plus clair, mais je suis ouvert aux suggestions.
Ma requête ressemble à ceci:
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
qui me donne
"ItemID","ProjectID","TariffID","CustomerID","Date"
"1","2","1","1","2010-11-10 00:00:00"
qui est la mauvaise date
SET @id=2
me donne:
"2","2","1","1",NULL
Wh ich est correcte, à l'exception de la date
SET @id=3
me donne:
"3","2","1","1",NULL
qui est aussi correcte, à l'exception de la date.
est ici la base de données
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');
Modifier: Un élément peut revenir à un ancien tarif ou d'un client. Dans ce cas, la date indiquée devrait être la date à laquelle cela s'est produit.
Malheureusement, je n'arrive pas à faire fonctionner cela avec les données réelles. Cela fonctionne avec les données de test dans le même scénario, donc je vous donnerai la prime à la fin de la journée si personne d'autre ne publie quoi que ce soit. –
Bummer. Si vous pouvez publier de nouvelles données de test, j'aurai probablement le temps d'en faire un autre. Merci. – Riedsio
ne pouvait pas fonctionner, mais il s'avère que ce serait beaucoup mieux dans une table séparée, car nous avons maintenant apparemment besoin de données historiques, aussi. Merci d'avoir essayé, cependant. –