MySQL 如何选择获取特定状态,如果不符合要求状态,则如何获取最后一个 ID?

标签 mysql sql

我在其他帖子中看到了类似的解决方案,但我无法将其应用于我的问题。

我有一张凭证上次历史记录表:

t_release:

+------------+--------+----------------+-- --------------+ |发布编号 |代码编号 | code_status_id |代码创建日期 | +------------+--------+----------------+-------- ----------+ | 1 | 32 | 2 | 2016 年 4 月 28 日 8:54 | | 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 | +------------+--------+----------------+-------- ----------+

r_code_status:

+----------------+------------+ | code_status_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)

+------------+--------+----------------+-- --------------+ |发布编号 |代码编号 | code_status_id |代码创建日期 | +------------+--------+----------------+-------- ----------+ | 3710 | 32 | 2 | 2016 年 6 月 18 日 10:20 | | 3711 | 33 | 2 | 2016 年 6 月 18 日 11:20 | | 3712 | 34 | 2 | 2016 年 6 月 18 日 0:20 | +------------+--------+----------------+-------- ----------+

我需要如果 code_id 满足 code_status_id = '3' 或 'Paid',查询可以检索它作为最后的历史记录,否则如果 code_idcode_status_id = '2' 然后检索最后一个 id(release_id)

我想要这样的结果:

+------------+--------+----------------+-- --------------+ |发布编号 |代码编号 | code_status_id |代码创建日期 | +------------+--------+----------------+-------- ----------+ | 2 | 32 | 3 | 2016 年 4 月 28 日 08:55 | | 3711 | 33 | 2 | 2016 年 6 月 18 日 11:20 | | 7 | 34 | 3 | 2016 年 4 月 28 日 0:54 | +------------+--------+----------------+-------- ----------+

数据链接:

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');

这是链接 sqlfiddle:http://sqlfiddle.com/#!9/87843

最佳答案

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)

第一个查询将获取所有已支付的,另一个将获取未支付的最后一个 release_id。

关于MySQL 如何选择获取特定状态,如果不符合要求状态,则如何获取最后一个 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39843750/

相关文章:

html - 表单提交后将纯html发送到mysql

php - 学说可以有多个到数据库的连接吗?

sql - 如何将具有公共(public)列 (A, B) 和 (A, C) 的 2 个查询变成只有一个 (A, B, C)?

mysql - 具有多对多内连接的聚合函数

sql - 使用带有 DISTINCT 的 ARRAY_AGG() 和带有 ORDINAL 的 ORDER BY

mysql - 如何在 mysql 中执行此操作 : "Select * from $table where varchar_number between numberInString1 and numberString2";

php - 如何使用 MySQL/PHP 对数据库结果进行排序和显示

mysql - 如何在 Datamapper 的 UPDATE 查询中添加 WHERE 子句

sql - 错误: Could not create constraint SQL Server 2008

mysql - SQL Select 当分组记录有多个匹配字符串时