假设我有一个表,其中包含成员加入和离开该类型组的事件
member_id| action | group | ts
----------------------------------------
member_1 | joins | group_a | 1445017260
member_2 | joins | group_b | 1445017551
member_2 | leaves | group_b | 1445017580
member_3 | joins | group_a | 1445017860
member_4 | joins | group_b | 1445017951
member_3 | leaves | group_a | 1445017980
member_3 | joins | group_b | 1445017990
member_5 | joins | group_b | 1445018051
member_6 | joins | group_a | 1445018580
...
我想确定谁在特定时间戳的特定组中。
例如谁在时间戳 1445018680 的 group_b 中(在本例中发生所有事件之后)所需的输出是:
[member_3, member_4, member_5]
我正在使用 php 和 sqlite3。目前,我只看到有机会迭代所有现有成员并进行选择,如下所示:
$inMembers = array();
$ts = 1445018680;
$group = "group_b";
foreach($members as $member){
$action = $DB->Select("SELECT * FROM events_$eventid WHERE group = :group AND event_ts <= :ts ORDER BY event_ts DESC LIMIT 1", array(
"ts" => $ts,
"group" => $group,
));
if($action == "joins") $inMembers[] = $member;
}
DB对象是一个抽象层。我希望我的意思很清楚。我猜想有一个更优雅的解决方案。也许没有循环。查询只需要 TS。
感谢您的帮助。 疯狂
最佳答案
此查询获取每个组成员的最新时间戳:
SELECT member_id,
MAX(event_ts)
FROM events_xxx
WHERE group = :group
AND event_ts <= :ts
GROUP BY member_id;
要获取这些行的其他列,请将其连接回原始表:
SELECT events.member_id
FROM events_xxx
NATURAL JOIN (SELECT member_id,
MAX(event_ts) AS event_ts
FROM events_xxx
WHERE group = :group
AND event_ts <= :ts
GROUP BY member_id
) AS latest_events
WHERE events.action = 'joins';
关于php - 在sqlite3 : looking for SELECT query for an actual composition of members of a certain group中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33583078/