为事件应用程序实现基于日期时间的类似Twitter的时间线查询

时间:2013-05-26 01:10:05

标签: android mysql codeigniter timeline

我正在使用codeigniter和mysql构建一个用于在android中共享事件的应用程序。我要做的是在android app中显示一个有限制的事件列表,假设每个查询只有10个结果,之后我可以执行“加载更多”任务。

如果我们谈论推特时间线,让我们说状态表有以下列(P.S.我编写了这些):

  • id(考虑这是自动增量的主键)
  • date_post
  • 鸣叫

如果用户发布推文,id会自动分配下一个自动增量值,而datetime列会分配当前时间,因此推文正确排序,较新的推文将插入较大的id。有了这个,为了在每次加载时显示限制20结果的时间线,我们将它从旧推文加载到新版本,我们可以使用以下查询(CMIIW):

SELECT * FROM TWEETS WHERE ID > last_id_loaded AND date_post >= last_date_loaded ORDER BY ID ASC LIMIT 20;

使用last_id_loaded参数,我们根据加载的最后一条推文发送,如果是第一次发送,则为0,与last_date_loaded参数相同。

现在让我们回到我的应用程序。我有一个名为events的表,其中包含以下列:

  • id(主键,自动增量)
  • 名称(活动名称)
  • date_start(活动将举行的日期时间)

当用户创建事件时,id将分配下一个自动增量值,但与前面提到的tweets表不同,事件不是基于datetime排序的,因为较大的id并不意味着更新的事件和反之亦然。例如:

----- | ----------- | -------------
id    | name        | date_start
----- | ----------- | -------------
1       Event A       2013-05-26 13:13:00
2       Event B       2013-05-23 09:00:00
3       Event C       2013-05-27 10:00:00
4       Event D       2013-05-27 10:00:00
5       Event E       2013-05-27 10:00:00
6       Event F       2013-05-28 08:00:00
7       Event G       2013-05-31 13:13:00
8       Event H       2013-05-29 09:00:00
9       Event I       2013-05-29 08:00:00
10      Event J       2013-05-30 13:13:00

如果我们根据date_start列进行订购,则应该是: 事件B,事件A,事件C,事件D,事件E,......,事件G。

正如我们所看到的,有3列具有相同的date_start值:事件C,D和E. 如果我想加载从旧版本到新版本的事件,每个查询只限制3个,我希望返回事件B,A,C,目前我使用以下查询:

SELECT * FROM EVENTS WHERE DATE_START >= last_date_retrieved ORDER BY DATE_START ASC, ID ASC

但是,我怎样才能确保下一个查询在此之后会产生下一个值?我的意思是前面的查询结果: B,A,C,最后一个date_start是2013-05-27 10:00:00

如果我使用上一个查询,它将产生C,D,E,而不是我预期的D,E和F.

我在这里缺少什么? 我准备好了一些建议。谢谢。

1 个答案:

答案 0 :(得分:0)

到目前为止,我想出了这些解决方案。我在事件表中添加了一个名为“counter”的新列,它将用作具有相同日期时间的事件的计数器。例如,如果我们插入新的事件数据,它将检查新插入的事件日期时间与其他事件。例如,如果表中存在最大值为5的相同日期时间,则新插入事件的计数器值将分配为5 + 1 = 6.我使用触发器执行此操作

    CREATE TRIGGER `events_BINS` BEFORE INSERT ON events FOR EACH ROW
    BEGIN 
       SET @cnt = NULL;
       IF EXISTS (SELECT 1 FROM events where date_start = new.date_start)  THEN 
           SELECT MAX(counter) into @cnt FROM events where date_start = new.date_start;
           SET new.counter = @cnt + 1;
       ELSE
           SET new.counter = 1;
       END IF;
    END;

我在更新之前也创建了一个触发器:

CREATE TRIGGER `events_BUPD` BEFORE UPDATE ON events FOR EACH ROW
BEGIN
  SET @cnt = NULL;
IF old.date_start != new.date_start THEN 
  IF EXISTS (SELECT 1 FROM events where date_start = new.date_start)  THEN
    SELECT MAX(counter) into @cnt FROM events where date_start = new.date_start;
    SET new.counter = @cnt + 1;
  ELSE
    SET new.counter = 1;
  END IF;
END IF;
END;

通过这种方法,我将能够使用这些where子句进行查询:

WHERE (date_start = last_date_retrieved AND counter > last_counter_retrieved) 
OR (date_start > last_date_retrieved)
ORDER BY date_start, counter asc

如果你们中的任何人有更好的方法,请告诉我。谢谢:))