Нам необходимо отслеживать изменение членства в наборе с течением времени. Я могу объяснить нашу проблему с помощью следующей простой таблицы:
+-----------+------------------+------+-----+---------+----------------+
| 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?