[英]How to exclude rows based on certain values and duplicates
我们具有与订阅事件相关的数据- create
, update
, delete
等。我希望能够基于某些值查询此数据,以便根据记录的事件确定给定用户在给定日期是否处于活动状态。 我有下表:( SQL摆在这里 )
CREATE TABLE events (
eid varchar(45) NOT NULL,
cid varchar(45) DEFAULT NULL,
sid varchar(45) DEFAULT NULL,
event_type varchar(45) DEFAULT NULL,
period_start datetime DEFAULT NULL,
period_end datetime DEFAULT NULL,
date date DEFAULT NULL,
datetime datetime DEFAULT NULL,
PRIMARY KEY (eid)
);
带有以下示例数据:
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'),
我正在寻找一个查询,我可以在其中输入任何日期,以根据period_start
, period_end
和event_type
查看此用户在这段时间内是否处于活动状态。
基本上,如果存在具有event_type = 'deleted'
,则它应排除该行以及其他所有具有相同sid
, period_start
和period_end
值的行。 我努力了:
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';
它应返回created
事件(但不返回任何内容),而使用日期2016-09-01
或2017-01-01
则不返回任何内容。 我不确定接下来要尝试什么。 我真的很希望能够在查询中完成此任务,而不必在PHP或JS中处理数据。
现在,您已经添加了有关如何删除已删除信息的描述,我建议以下内容:
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
先前的答案:我真的不知道您想要什么,如果您列出一组参数然后列出这些参数的预期结果,也许会有所帮助?
在这种情况下,这可能会有所帮助:
查询1 :
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 |
查询2 :
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 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.