【发布时间】:2018-05-02 16:36:15
【问题描述】:
我们需要跟踪随时间变化的集合成员。我可以用下面这个简单的表格来解释我们的问题:
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| timestamp | varchar(8) | NO | | NULL | |
| member | varchar(4) | NO | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
SELECT * 操作的结果如下:
SELECT * FROM My_Table;
+----+-----------+--------+
| id | timestamp | member |
+----+-----------+--------+
| 1 | 20150101 | A |
| 2 | 20150101 | B |
| 3 | 20150101 | C |
| 4 | 20180101 | A |
| 5 | 20180101 | D |
| 6 | 20180101 | E |
+----+-----------+--------+
从逻辑上讲,我们可以使用 SET 操作 MINUS 和 INTERSECT 来了解在一段时间内添加、删除或保留了哪些成员。例如,下面的“逻辑”集合操作给出了在 20150101 和 20180101 之间添加的成员数:
SELECT member FROM my_table WHERE timestamp = "20180101"
MINUS
SELECT member FROM my_table WHERE timestamp = "20150101";
类似地,以下“逻辑”集合操作给出了在 20150101 和 20180101 之间删除的成员数:
SELECT member FROM my_table WHERE timestamp = "20150101"
MINUS
SELECT member FROM my_table WHERE timestamp = "20180101";
以下“逻辑”集合操作给出了 20150101 和 20180101 之间保留的成员数:
SELECT member FROM my_table WHERE timestamp = "20150101"
INTERSECT
SELECT member FROM my_table WHERE timestamp = "20180101";
在 MySQL 中实现这些逻辑集合操作的最优雅的方式是什么?
【问题讨论】:
-
您需要定义/解释该时间戳值代表什么。
-
在此上下文中,时间戳表示评估集成员身份的时间
-
如“成员 X 是时间戳 T 的成员”?
-
是的,X 是时间戳 T 的成员
标签: mysql set-operations