我正在使用codeigniter和mysql构建一个用于在android中共享事件的应用程序。我要做的是在android app中显示一个有限制的事件列表,假设每个查询只有10个结果,之后我可以执行“加载更多”任务。
如果我们谈论推特时间线,让我们说状态表有以下列(P.S.我编写了这些):
如果用户发布推文,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将分配下一个自动增量值,但与前面提到的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.
我在这里缺少什么? 我准备好了一些建议。谢谢。
答案 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
如果你们中的任何人有更好的方法,请告诉我。谢谢:))