注意:由combination
,我将参考svc_id
和loc_id
我有兴趣找到combination
设置为零的最新独特的status
,如果combination
将status
设置为零,但后来又将其设置为1,那么combination
应该被忽略!
MySQL 5.6架构设置:
CREATE TABLE `activity_log` (
`id` int(11) NOT NULL,
`prj_id` bigint(20) NOT NULL,
`svc_id` bigint(20) NOT NULL,
`loc_id` bigint(20) NOT NULL,
`status` tinyint(1) NOT NULL,
`created_by` bigint(20) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`deleted_by` bigint(20) DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
INSERT INTO `activity_log` (`id`, `prj_id`, `svc_id`, `loc_id`, `status`, `created_by`, `created_at`, `deleted_by`, `deleted_at`) VALUES
(1, 7751, 7825, 5321, 1, 1, '2018-02-26 06:16:52', NULL, NULL),
(2, 7751, 7821, 5321, 0, 1, '2018-02-26 06:17:05', 1, '2018-02-26 06:17:33'),
(3, 7751, 7821, 5323, 1, 1, '2018-02-26 06:17:05', NULL, NULL),
(4, 7751, 7825, 5324, 0, 1, '2018-02-26 06:16:52', 1, '2018-02-26 06:17:33'),
(5, 7751, 7825, 5325, 1, 1, '2018-02-26 06:16:52', NULL, NULL),
(6, 7751, 7825, 5326, 0, 1, '2018-02-26 06:16:52', 1, '2018-02-26 06:17:33'),
(7, 7751, 7821, 5327, 0, 1, '2018-02-26 06:17:05', 1, '2018-02-26 06:17:33'),
(8, 7751, 7825, 5326, 1, 1, '2018-02-26 06:16:52', NULL, NULL);
查询1:显示所有结果
SELECT * FROM `activity_log`
| id | prj_id | svc_id | loc_id | status | created_by | created_at | deleted_by | deleted_at |
|----|--------|--------|--------|--------|------------|----------------------|------------|----------------------|
| 1 | 7751 | 7825 | 5321 | true | 1 | 2018-02-26T06:16:52Z | (null) | (null) |
| 2 | 7751 | 7821 | 5321 | false | 1 | 2018-02-26T06:17:05Z | 1 | 2018-02-26T06:17:33Z |
| 3 | 7751 | 7821 | 5323 | true | 1 | 2018-02-26T06:17:05Z | (null) | (null) |
| 4 | 7751 | 7825 | 5324 | false | 1 | 2018-02-26T06:16:52Z | 1 | 2018-02-26T06:17:33Z |
| 5 | 7751 | 7825 | 5325 | true | 1 | 2018-02-26T06:16:52Z | (null) | (null) |
| 6 | 7751 | 7825 | 5326 | false | 1 | 2018-02-26T06:16:52Z | 1 | 2018-02-26T06:17:33Z |
| 7 | 7751 | 7821 | 5327 | false | 1 | 2018-02-26T06:17:05Z | 1 | 2018-02-26T06:17:33Z |
| 8 | 7751 | 7825 | 5326 | true | 1 | 2018-02-26T06:16:52Z | (null) | (null) |
查询2:显示脱机组合
SELECT * FROM `activity_log` WHERE `status` = 0 GROUP BY `svc_id`, `loc_id` ORDER BY `id` DESC;
| id | prj_id | svc_id | loc_id | status | created_by | created_at | deleted_by | deleted_at |
|----|--------|--------|--------|--------|------------|----------------------|------------|----------------------|
| 7 | 7751 | 7821 | 5327 | false | 1 | 2018-02-26T06:17:05Z | 1 | 2018-02-26T06:17:33Z |
| 6 | 7751 | 7825 | 5326 | false | 1 | 2018-02-26T06:16:52Z | 1 | 2018-02-26T06:17:33Z |
| 4 | 7751 | 7825 | 5324 | false | 1 | 2018-02-26T06:16:52Z | 1 | 2018-02-26T06:17:33Z |
| 2 | 7751 | 7821 | 5321 | false | 1 | 2018-02-26T06:17:05Z | 1 | 2018-02-26T06:17:33Z |
预期结果:应排除ID 6,因为它的combination
已在ID 8中激活
| id | prj_id | svc_id | loc_id | status | created_by | created_at | deleted_by | deleted_at |
|----|--------|--------|--------|--------|------------|----------------------|------------|----------------------|
| 7 | 7751 | 7821 | 5327 | false | 1 | 2018-02-26T06:17:05Z | 1 | 2018-02-26T06:17:33Z |
| 4 | 7751 | 7825 | 5324 | false | 1 | 2018-02-26T06:16:52Z | 1 | 2018-02-26T06:17:33Z |
| 2 | 7751 | 7821 | 5321 | false | 1 | 2018-02-26T06:17:05Z | 1 | 2018-02-26T06:17:33Z |
CREATE TABLE `activity_log` (
`id` int(11) NOT NULL,
`svc_id` bigint(20) NOT NULL,
`loc_id` bigint(20) NOT NULL,
`status` tinyint(1) NOT NULL
);
INSERT INTO `activity_log` (`id`, `svc_id`, `loc_id`, `status`) VALUES
(1, 7825, 5321, 1),
(2, 7821, 5321, 0),
(3, 7821, 5323, 1),
(4, 7825, 5324, 0),
(5, 7825, 5325, 1),
(6, 7825, 5326, 0),
(7, 7821, 5327, 0),
(8, 7825, 5326, 1);
SELECT a.*
FROM activity_log a
JOIN
( SELECT MAX(id) id FROM activity_log GROUP BY svc_id,loc_id) b
ON b.id = a.id
WHERE a.status = 0;
+----+--------+--------+--------+
| id | svc_id | loc_id | status |
+----+--------+--------+--------+
| 2 | 7821 | 5321 | 0 |
| 4 | 7825 | 5324 | 0 |
| 7 | 7821 | 5327 | 0 |
+----+--------+--------+--------+
编辑:为了证明cdaiga解决方案的谬误,请考虑这个简化的例子......
DROP TABLE IF EXISTS activity_log;
CREATE TABLE `activity_log`
(`id` int(11) NOT NULL
,`svc_id` bigint(20) NOT NULL
,`loc_id` bigint(20) NOT NULL
,`status` tinyint(1) NOT NULL
, INDEX(loc_id,svc_id)
);
INSERT INTO `activity_log` (`id`, `svc_id`, `loc_id`, `status`) VALUES
( 1, 5, 1, 1),
( 2, 1, 1, 0),
( 3, 1, 3, 1),
( 4, 5, 4, 0),
( 5, 5, 5, 1),
( 6, 5, 6, 0),
( 7, 1, 7, 0),
( 8, 5, 6, 1),
( 9, 5, 1, 0),
(10, 5, 1, 1),
(11, 1, 1, 0);
正确答案如下:
SELECT a.*
FROM activity_log a
JOIN
( SELECT MAX(id) id FROM activity_log GROUP BY svc_id,loc_id) b
ON b.id = a.id
WHERE a.status = 0;
+----+--------+--------+--------+
| id | svc_id | loc_id | status |
+----+--------+--------+--------+
| 4 | 5 | 4 | 0 |
| 7 | 1 | 7 | 0 |
| 11 | 1 | 1 | 0 |
+----+--------+--------+--------+
但是,cdaiga的回答可能会给出错误的结果,如下所示:
SELECT A.*
FROM `activity_log` A
WHERE A.`status` = 0 AND
NOT EXISTS (SELECT null
FROM `activity_log` B
WHERE A.`svc_id`=B.`svc_id` AND A.`loc_id`=B.`loc_id`
AND B.`status`=1)
GROUP BY `svc_id`, `loc_id`
ORDER BY `id` DESC;
+----+--------+--------+--------+
| id | svc_id | loc_id | status |
+----+--------+--------+--------+
| 7 | 1 | 7 | 0 |
| 4 | 5 | 4 | 0 |
| 2 | 1 | 1 | 0 |
+----+--------+--------+--------+