단어 넣는 것은 상당히 어색한 일이지만 항목이 처음에는 관세/고객으로 전환 할 때 행을 원합니다. 품목이 고객으로 전환하는 경우 관세 차이와 상관없이 전환 일자를 반환해야합니다. 품목이 프로젝트를 전환하는 경우 새 프로젝트의 관세가 기존 관세와 동일하지 않은 경우 반환 된 날짜가 변경되어서는 안됩니다.필드가 처음 현재 값으로 변경된 날짜 가져 오기
내가 어떻게 명확하게 할 수 있는지 잘 모르겠지만 제안을 할 수 있습니다.
내 쿼리는 다음과 같습니다
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
잘못된 날짜
SET @id=2
에게 있습니다
"ItemID","ProjectID","TariffID","CustomerID","Date"
"1","2","1","1","2010-11-10 00:00:00"
나에게주는 나에게 제공합니다
"2","2","1","1",NULL
ㅁ을 떨어져 날로부터, 또한 올바른
"3","2","1","1",NULL
을 : ICH 나에게 준다 떨어져 날짜
SET @id=3
에서, 올바른 것입니다.
다음은 데이터베이스에게의
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');
편집 : 항목이 오래된 관세 또는 고객에게 돌아갈 수 있습니다. 이 경우 표시된 날짜는 발생한 날짜 여야합니다.
불행히도이 데이터를 실제 데이터로 처리 할 수는 없습니다. 그것은 동일한 시나리오의 테스트 데이터와 함께 작동하므로 다른 사람이 아무것도 게시하지 않으면 하루가 끝날 때 현상금을 줄 것입니다. –
Bummer. 새로운 테스트 데이터를 게시 할 수 있다면 다른 테스트 데이터를 가져갈 시간이있을 것입니다. 감사. – Riedsio
는 아무것도 작동하지 못했지만 지금은 분명히 역사적인 데이터가 필요하기 때문에 별도의 테이블에서 훨씬 더 나을 것입니다. 그래도 고마워. –