1

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

如果我们谈论 twitter 时间线,假设状态表有以下列(PS 我编了这些):

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

如果用户发布一条推文,id 自动分配下一个自动增量值,日期时间列分配当前时间,因此推文排序正确,新的推文将插入更大的 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(活动举行的日期时间)
  • ETC

当用户创建事件时,id 将分配下一个自动增量值,但与我之前提到的 tweets 表不同,事件不是基于日期时间排序的,因为更大的 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 列排序,应该是:Event B, Event A, Event C, Event D, Event E, .... , Event 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 with last date_start is 2013-05-27 10:00:00

如果我使用前面的查询,它将像我预期的那样产生 C、D、E,而不是 D、E 和 F。

我在这里想念什么?我准备得到一些建议。谢谢你。

4

1 回答 1

0

到目前为止,我想出了这些解决方案。我在事件表中添加了名为“计数器”的新列,它将用作具有相同日期时间的事件的计数器。例如,如果我们插入新的事件数据,它将与其他检查新插入的事件日期时间。例如,如果表中存在最大值为 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

请让我知道你们中是否有人对此有更好的方法。谢谢 :)

于 2013-05-26T17:40:57.367 回答