MYSQL 获取最新职位编号
MYSQL get latest job number
我有这个table:
TableNumber(Int 0 to 25)|Name(varchar 100)|Project(varchar 15)|StartDate(Datetime)
1 |David |P1 |'2015-02-06 08:00:00'
2 |Sebastien |P2 |'2015-02-06 08:00:00'
1 |David |P4 |'2015-02-06 12:00:00'
2 |Sebastien |P3 |'2015-02-07 08:00:00'
我希望在规定的日期为每个人找到最新的工作。
我想要:
TableNumber(Int 0 to 25)|Name(varchar 100)|Project(varchar 15)|StartDate(Datetime)
2 |Sebastien |P2 |'2015-02-06 08:00:00'
1 |David |P4 |'2015-02-06 12:00:00'
所以我想排除 P3,因为它不是“2015-02-06”,我想排除 P1,因为它不是 David 的最新工作(它的 P4)。
请考虑以下示例中的 NOW() returns '2015-02-06 15:00:00'。
这是我尝试过的:
SELECT * FROM MyTable WHERE DATEDIFF(startdate, NOW()) = 0 ORDER BY tablenum DESC;
但这只排除了P3
所以我尝试了这个:
SELECT * FROM MyTable AS p WHERE DATEDIFF(p.startdate, NOW()) = 0 AND TIMEDIFF(p.startdate, NOW()) = (SELECT MAX(TIMEDIFF(p2.startdate, NOW())) FROM MyTable AS p2 WHERE p2.startdate = p.startdate) ORDER BY tablenum DESC;
但还是不排除P1
有人知道我是怎么做到的吗?顺便说一句,开始日期将始终是一个小时(08:00:00 或 12:00:00 或 22:00:00...)
更新
是的,因为不是很清楚我想要什么,我会在这里澄清一下:
我需要知道每个人的最后一个项目。
所以在我的 table 中,我需要知道 Sebastien 在 table 2 号的 P2 上工作,而 David 在 table 1 号上的 P4 上工作。我不想P1 因为它不是 David 从事的最后一个项目(上一个项目我还包括他现在正在从事的项目)。我也想排除以后的一切所以P3(明天是谁)一定不能显示。
以下查询将为您提供给定名称在给定日期的最早工作的 date/time。在下面的示例中,我假设您想要每个用户在 2015-02-06 的最早工作。
SELECT Name, min(StartDate)
FROM MyTable
WHERE StartDate >= '2015-02-06'
AND StartDate < '2015-02-07'
GROUP BY Name
使用上面的查询,你可以很容易地得到最终的解决方案:
SELECT t1.project, t2.name, t2.StartDate
FROM MyTable t1 INNER JOIN
(SELECT Name, min(StartDate)
FROM MyTable
WHERE StartDate >= '2015-02-06'
AND StartDate < '2015-02-07'
GROUP BY Name) t2 ON t1.Name = t2.Name AND t1.StartDate = t2.StartDate
我有这个table:
TableNumber(Int 0 to 25)|Name(varchar 100)|Project(varchar 15)|StartDate(Datetime)
1 |David |P1 |'2015-02-06 08:00:00'
2 |Sebastien |P2 |'2015-02-06 08:00:00'
1 |David |P4 |'2015-02-06 12:00:00'
2 |Sebastien |P3 |'2015-02-07 08:00:00'
我希望在规定的日期为每个人找到最新的工作。
我想要:
TableNumber(Int 0 to 25)|Name(varchar 100)|Project(varchar 15)|StartDate(Datetime)
2 |Sebastien |P2 |'2015-02-06 08:00:00'
1 |David |P4 |'2015-02-06 12:00:00'
所以我想排除 P3,因为它不是“2015-02-06”,我想排除 P1,因为它不是 David 的最新工作(它的 P4)。
请考虑以下示例中的 NOW() returns '2015-02-06 15:00:00'。
这是我尝试过的:
SELECT * FROM MyTable WHERE DATEDIFF(startdate, NOW()) = 0 ORDER BY tablenum DESC;
但这只排除了P3
所以我尝试了这个:
SELECT * FROM MyTable AS p WHERE DATEDIFF(p.startdate, NOW()) = 0 AND TIMEDIFF(p.startdate, NOW()) = (SELECT MAX(TIMEDIFF(p2.startdate, NOW())) FROM MyTable AS p2 WHERE p2.startdate = p.startdate) ORDER BY tablenum DESC;
但还是不排除P1
有人知道我是怎么做到的吗?顺便说一句,开始日期将始终是一个小时(08:00:00 或 12:00:00 或 22:00:00...)
更新
是的,因为不是很清楚我想要什么,我会在这里澄清一下:
我需要知道每个人的最后一个项目。
所以在我的 table 中,我需要知道 Sebastien 在 table 2 号的 P2 上工作,而 David 在 table 1 号上的 P4 上工作。我不想P1 因为它不是 David 从事的最后一个项目(上一个项目我还包括他现在正在从事的项目)。我也想排除以后的一切所以P3(明天是谁)一定不能显示。
以下查询将为您提供给定名称在给定日期的最早工作的 date/time。在下面的示例中,我假设您想要每个用户在 2015-02-06 的最早工作。
SELECT Name, min(StartDate)
FROM MyTable
WHERE StartDate >= '2015-02-06'
AND StartDate < '2015-02-07'
GROUP BY Name
使用上面的查询,你可以很容易地得到最终的解决方案:
SELECT t1.project, t2.name, t2.StartDate
FROM MyTable t1 INNER JOIN
(SELECT Name, min(StartDate)
FROM MyTable
WHERE StartDate >= '2015-02-06'
AND StartDate < '2015-02-07'
GROUP BY Name) t2 ON t1.Name = t2.Name AND t1.StartDate = t2.StartDate