Mysql 如何基于某些值和重复项排除行

Mysql 如何基于某些值和重复项排除行,mysql,Mysql,我们有与订阅事件相关的数据-创建、更新、删除等。我希望能够基于某些值查询这些数据,以根据记录的事件确定给定用户在给定日期是否处于活动状态。我有下表: 使用以下示例数据: INSERT INTO events (eid, cid, sid, event_type, period_start, period_end, date, datetime) VALUES ('event_1', 'customer_1', 'subscription_456', 'created', '2016-03

我们有与订阅事件相关的数据-创建、更新、删除等。我希望能够基于某些值查询这些数据,以根据记录的事件确定给定用户在给定日期是否处于活动状态。我有下表:

使用以下示例数据:

INSERT INTO events
  (eid, cid, sid, event_type, period_start, period_end, date, datetime)
VALUES
  ('event_1', 'customer_1', 'subscription_456', 'created', '2016-03-11 17:38:50', '2016-09-11 18:38:50', '2016-03-11', '2016-03-11 17:38:51');
  ('event_2', 'customer_1', 'subscription_456', 'updated', '2016-09-11 18:38:50', '2017-03-11 17:38:50', '2016-09-11', '2016-09-11 18:46:04'),
  ('event_3', 'customer_1', 'subscription_456', 'deleted', '2016-09-11 18:38:50', '2017-03-11 17:38:50', '2016-09-11', '2016-09-11 22:39:43'),
我正在寻找一个查询,在该查询中,我可以输入任何日期,根据时段开始、时段结束和事件类型,查看此用户在此期间是否处于活动状态

基本上,如果存在事件类型为“已删除”的行,则应排除该行以及具有相同sid、周期开始和周期结束值的任何其他行。我试过:

SELECT e.* FROM events e
JOIN (SELECT sid, event_type, period_start, period_end
    FROM events) e2
    ON
        (e2.sid = e.sid AND e2.event_type = "deleted"
        AND e2.period_start = e.period_start
        AND e2.period_end = e.period_end)
    WHERE
        (e.event_type = 'created' OR e.event_type = 'updated')
        AND date(e.period_start) <= '2016-04-01'
        AND date(e.period_end) >= '2016-04-01';

它应该返回创建的事件,但不返回任何内容,而使用日期2016-09-01或2017-01-01则不应返回任何内容。我不知道下一步该试什么。我真的希望能够在查询中实现这一点,而不必用PHP或JS处理数据。

很难判断给定样本数据中有哪些内容被破坏

但是,调试SQL停止返回值的行非常重要:

请参见下面的示例,在SQL突出显示的部分仍返回一行


但是,如果在最后运行另外两行,将不会有结果,并且需要再次检查原因?因为SQL第11行之后没有数据匹配,因为您现在添加了一个关于如何排除已删除信息的说明,所以我建议如下:

SELECT  e.eid, e.cid, e.sid, e.event_type, e.period_start, e.period_end, e2.eid, e2.event_type
FROM events e
left join events e2
       on e.sid = e2.sid and e.event_type <> 'deleted' and e2.event_type = 'deleted'
       AND e.period_start = e2.period_start AND e.period_end = e2.period_end
WHERE e.event_type <> 'deleted'
AND e2.eid IS NULL
AND  '2016-04-01' between e.period_start and e.period_end
:

问题2:


根据你的样本数据,应该没有结果。除非样本数据中存在打字错误。日期由于事件3的时段开始和时段结束与事件2相同,删除的日期应取消更新的日期。再说一次,我甚至不确定这是否仅在SQL中是可行的,但我想我应该先试一试。你说应该打折任何其他行是什么意思?a:删除的行应该被忽略-或者b:只考虑删除的行-或者c:删除的行更重要如何-或者d:请详细说明。删除的行以及与删除的行具有相同的句点开始和句点结束值的任何更新行都应该从查询中排除。我想我已经接近了。从事件e中选择e.eid、e.cid、e.sid、e.event_type、e.period_start、e.period_end在e.sid=e2.sid和e2.event_type='deleted',e.event_type='updated',e.period_start和e.period_end之间选择应排除的正确行,所以,如果我做一个左排除连接,那么它应该返回我想寻找的行。现在修补这个想法。。。
SELECT  e.eid, e.cid, e.sid, e.event_type, e.period_start, e.period_end, e2.eid, e2.event_type
FROM events e
left join events e2
       on e.sid = e2.sid and e.event_type <> 'deleted' and e2.event_type = 'deleted'
       AND e.period_start = e2.period_start AND e.period_end = e2.period_end
WHERE e.event_type <> 'deleted'
AND e2.eid IS NULL
AND  '2016-04-01' between e.period_start and e.period_end
SELECT e.* 
FROM events e
WHERE '2016-04-01' between e.period_start and e.period_end
|     eid |        cid |              sid | event_type |            period_start |                  period_end |                    date |                datetime |
|---------|------------|------------------|------------|-------------------------|-----------------------------|-------------------------|-------------------------|
| event_1 | customer_1 | subscription_456 |    created | March, 11 2016 17:38:50 | September, 11 2016 18:38:50 | March, 11 2016 00:00:00 | March, 11 2016 17:38:51 |
SELECT  e.eid, e.cid, e.sid, e.event_type, e.period_start, e.period_end, e2.eid, e2.event_type
FROM events e
left join events e2
       on e.sid = e2.sid and e.event_type <> 'deleted' and e2.event_type = 'deleted'
WHERE '2016-04-01' between e.period_start and e.period_end
|     eid |        cid |              sid | event_type |            period_start |                  period_end |     eid | event_type |
|---------|------------|------------------|------------|-------------------------|-----------------------------|---------|------------|
| event_1 | customer_1 | subscription_456 |    created | March, 11 2016 17:38:50 | September, 11 2016 18:38:50 | event_3 |    deleted |