我们有与订阅活动相关的数据 - create
,update
,delete
等。我希望能够根据某些值查询此数据,以确定是否给定用户在给定日期根据记录的事件处于活动状态。我有下表:(SQL fiddle here)
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处理数据。
答案 0 :(得分:1)
正如您现在添加了关于如何排除已删除信息的说明,我建议如下:
YourCell.Image.WidthRequest = DependencyService.Get<IScreen>().GetScreenWidth * 0.1;
上一个答案: 我真的不知道你想要什么,也许如果列出一组参数会有所帮助,然后列出那些预期的结果?
如果没有这个可能会有所帮助:
查询1 :
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
<强> Results 强>:
SELECT e.*
FROM events e
WHERE '2016-04-01' between e.period_start and e.period_end
查询2 :
| 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 |
<强> Results 强>:
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
答案 1 :(得分:0)