MySQL status_id随时间变化根据所需状态选择最新状态

时间:2017-03-22 06:58:01

标签: mysql

我知道这听起来有点奇怪,但我不知道如何在没有示例的情况下更好地解释这一点。

我有下表

ID contract_id status_id created
1  1           1        2015-10-14
2  1           2        2015-10-15
3  1           1        2016-02-02
4  1           4        2017-03-01

如果查询类似于 SELECT * FROM表WHERE status_id = 1并创建BETWEEN 2015-10-10和2017-03-05 不应显示contract_id = 1的项目,因为该日期间隔中的最新状态为4 但如果查询是这样的 SELECT * FROM表WHERE status_id = 1并创建BETWEEN 2015-10-10 AND 2017-02-28带有contract_id 1的项应该显示,因为最新的status_id = 1

基本上我需要的是这样的:如果在结束日期status_id = 1,请给我最新的项目

我知道这很简单但我现在绕圈跑来跑去。我确实尝试了abs(datediff(结束,开始)),选择基于if或select in select但我没有得到我正在寻找的结果。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

Oracle:

if (string.IsNullOrEmpty(path))
    sPolPath = false;
else
    sPolPath = Path.GetPathRoot(path).Length < 2;

MySQL:

SELECT * FROM table WHERE status_id = 1 AND created BETWEEN 2015-10-10 AND 2017-03-05 AND ROWNUM <=1 ORDER BY created desc

SQL Server:

SELECT * FROM table WHERE status_id = 1 AND created BETWEEN 2015-10-10 AND 2017-03-05 ORDER BY created desc LIMIT 1

我理解你的问题是你想要一个status_id = 1并且最近创建日期的项目

答案 1 :(得分:0)

其中一种方法是使用给定contract_id具有所需状态的最新日期的INNER JOIN,并测试日期是否早于边界日期:

编辑:在进一步阅读评论后,很可能这个评论将完全符合您的需求

SELECT t.*
FROM statuses AS t 
INNER JOIN (
    SELECT max(id) AS lastid, max(created) AS lastdate
    FROM statuses
    WHERE status_id = 1 AND created < '2016-01-01'
    GROUP BY contract_id 
    ) AS latest ON t.ID = latest.lastid 

请注意,只有在按时间顺序排列日期时才会起作用,换句话说就是每个contract_id的日期:ID'&lt; ID''≡create'&lt;创建 ''