Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL如果不满足需求状态,我如何选择获取特定状态和获取最后一个ID?_Mysql_Sql - Fatal编程技术网

MySQL如果不满足需求状态,我如何选择获取特定状态和获取最后一个ID?

MySQL如果不满足需求状态,我如何选择获取特定状态和获取最后一个ID?,mysql,sql,Mysql,Sql,我在其他帖子上看到过类似的解决方案,但我在将其应用于我的问题时遇到了一个问题 我有上一次历史记录的此表: t_发布: +------+-----+--------+----------+ |发布|代码|代码|状态|代码|创建|日期| +------+-----+--------+----------+ | 1 | 32 | 2 | 4/28/2016 8:54 | | 1 | 32 |

我在其他帖子上看到过类似的解决方案,但我在将其应用于我的问题时遇到了一个问题

我有上一次历史记录的此表:

t_发布:

+------+-----+--------+----------+ |发布|代码|代码|状态|代码|创建|日期| +------+-----+--------+----------+ | 1 | 32 | 2 | 4/28/2016 8:54 | | 1 | 32 | 2 | 4/28/2016 8:54 | | 2 | 32 | 3 | 4/28/2016 8:55 | | 3710 | 32 | 2 | 6/18/2016 10:20 | | 4 | 33 | 2 | 4/28/2016 9:54 | | 5 | 33 | 2 | 4/28/2016 10:54 | | 3711 | 33 | 2 | 6/18/2016 11:20 | | 6 | 34 | 2 | 4/28/2016 11:54 | | 7 | 34 | 3 | 4/28/2016 0:54 | | 3712 | 34 | 2 | 6/18/2016 0:20 | +------+-----+--------+----------+

r\u代码\u状态:

+--------+-------+ |代码(状态)id |代码(状态)| +--------+-------+ |1 |可用| |2 |请求| |3 |已支付| +--------+-------+

当我跑步时:

SELECT 
t1.release_id,
t1.code_id,
t1.code_status_id,
t1.code_created_date
FROM t_release t1
LEFT JOIN t_release t2 ON t1.code_id = t2.code_id AND t1.release_id < t2.release_id
WHERE ISNULL(t2.release_id)
这是link sqlfiddle:


第一个查询将获取所有已支付的内容,另一个查询将获取未支付内容的最后版本id。

您可以使用MySQL用户定义的变量来实现这一点


代码创建日期的数据类型是什么?代码创建日期的数据类型是日期时间。我已经添加了DDL和link sqlfiddle是否有可能多个记录在同一个code_id下具有code_status_id=3?没有,不可能在同一代码\u id下出现代码\u status\u id=3的多条记录。除了代码\u status\u id=2将在同一代码\u id下出现记录。因为客户端应用程序可以多次触发按钮请求并进行记录。如果已付款,则消息将显示在客户端应用程序上,无法再次请求
create table t_release (
release_id INTEGER(11) NOT NULL AUTO_INCREMENT,
code_id INTEGER(11) DEFAULT NULL,
code_status_id TINYINT(4) DEFAULT NULL,
code_created_date DATETIME DEFAULT NULL,
PRIMARY KEY (`release_id`)
) ENGINE=InnoDB
AUTO_INCREMENT=1 ROW_FORMAT=DYNAMIC CHARACTER SET 'utf8';

INSERT INTO t_release
(`release_id`,`code_id`,`code_status_id`,`code_created_date`)
VALUES
(1, '32', '2', '2016-4-28 8:54'),
(2, '32', '3', '2016-4-28 8:55'),
(3710, '32', '2', '2016-6-18 10:20'),
(4, '33', '2', '2016-4-28 9:54'),
(5, '33', '2', '2016-4-28 10:54'),
(3711, '33', '2', '2016-6-18 11:20'),
(6, '34', '2', '2016-4-28 11:54'),
(7, '34', '3', '2016-4-28 0:54'),
(3712, '34', '2', '2016-6-18 0:20');
SELECT * FROM t_release t where release_id IN 
    (SELECT DISTINCT release_id FROM t_release WHERE code_status_id = 3)
UNION ALL
SELECT * FROM t_release t where release_id IN 
    (SELECT MAX(release_id) FROM t_release x WHERE 
    NOT EXISTS (SELECT 1 FROM t_release y WHERE code_status_id = 3 and y.code_id = x.code_id))
   GROUP BY code_id)
SELECT 
t.release_id,
t.code_id,
t.code_status_id,
t.code_created_date
FROM 
(
  SELECT 
  *,
  IF(@sameCodeID = code_id, @rn := @rn + 1,
     IF(@sameCodeID := code_id, @rn := 1, @rn := 1)
   ) AS row_number
  FROM t_release t
  CROSS JOIN (SELECT @sameCodeID := 0, @rn := 1) AS var
  ORDER BY code_id, code_status_id DESC, release_id DESC
) AS t
WHERE t.row_number <= 1
ORDER BY t.code_id