MySQL如何选择获取特定状态,如果不满足要求状态,还可以获取最后一个ID?

我已经在其他帖子上看到了类似的解决方案,但是我在将问题应用到我的问题时遇到了问题.

我有这张桌子作为凭证的最后历史:

t_release:

 ———— ——— —————- ————- ——
| release_id | code_id | code_status_id | code_created_date |
 ———— ——— —————- ————- ——
| 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 | code_status |
 —————- ————-
| 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)

 ———— ——— —————- ————- ——
| release_id | code_id | code_status_id | code_created_date |
 ———— ——— —————- ————- ——
| 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’或’付费’,则查询可以将其作为最后历史记录检索,否则如果code_id使用code_status_id =’2’则检索到最后一个id(release_id).

我想要这样的结果:

 ———— ——— —————- ————- ——
| release_id | code_id | code_status_id | code_created_date |
 ———— ——— —————- ————- ——
| 2 | 32 | 3 | 2016年4月28日08:55 |
| 3711 | 33 | 2 | 2016年6月18日11:20 |
| 7 | 34 | 3 | 2016年4月28日0:54 |
 ———— ——— —————- ————- ——

DDL:

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.

点赞