查询获取最新培训日期

时间:2013-02-14 18:27:37

标签: mysql

我们有2个表,一个是带有所有驱动程序详细信息的驱动程序,表格是dTraining。

驱动程序的结构是

CREATE TABLE IF NOT EXISTS `driver` (
  `driverID` int(5) NOT NULL,
  `clientID` int(5) NOT NULL,
  `driverName` varchar(100) NOT NULL,
  `driverDateOfBirth` date NOT NULL,  
  `driverStatus` enum('a','d','i') NOT NULL DEFAULT 'a'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

dTraining的结构是

CREATE TABLE IF NOT EXISTS `dTraining` (
  `dTrainingID` int(5) NOT NULL,
  `cTrainingID` int(5) NOT NULL,
  `trainingID` int(11) NOT NULL,
  `driverID` int(5) NOT NULL,
  `clientID` int(5) NOT NULL,
  `driverTrainingDate` date NOT NULL,
  `driverTrainingUpdateStatus` enum('d','a') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我需要的是,当我运行这样的查询时,应该根据驱动程序的许多训练数据进行最新训练。所以我需要有关如何在那里运行子查询的帮助。

SELECT driver.driverID,dTraining.driverTrainingDate
 FROM   driver,dTraining

目前我有这个查询。样本输出将是

driverID=1 , driverTrainingDate=2013-02-01
driverID=2 , driverTrainingDate=2013-02-02

SELECT driver.driverID,b.driverTrainingDate
 FROM   driver
             LEFT JOIN (
  SELECT B1.*
                      FROM   dTraining AS B1
                             LEFT JOIN  dTraining AS B2
                                    ON B1.driverID = B2.driverID
                                       AND B1.cTrainingID = B2.cTrainingID 
                                       AND B1.driverTrainingDate< B2.driverTrainingDate
                      WHERE B1.cTrainingID =".$cTID." And B2.driverID IS NULL) as b
ON ( driver.driverID= b.driverID)

我很好奇为什么我们需要把B1.driverTrainingDate&lt; B2.driverTrainingDate而不是B1.driverTrainingDate&gt; B2.driverTrainingDate和B2.driverID IS NULL的需要

2 个答案:

答案 0 :(得分:1)

与B2的左连接返回在B1之后发生的训练,这就是为什么如果不存在(B2.driverID is null)你确定B1的训练是最后一次。

答案 1 :(得分:1)

尝试此操作,为driverID更改'123'

select d.*,t.* 
from driver as d
inner join dtraining as t
on d.driverId=t.driverId
where d.driverid in (1,2,3,4.......10000)
order by t.driverTrainingDate desc
limit 1