我在其他帖子中看到了类似的解决方案,但我无法将其应用于我的问题。
我有一张凭证上次历史记录表:
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_id
和 code_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/