我已经在其他帖子上看到了类似的解决方案,但是我在将问题应用到我的问题时遇到了问题.
我有这张桌子作为凭证的最后历史:
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.