2013-05-26 14 views
1

我正在構建一個應用程序,用於在codeigniter和mysql中與android共享事件。我想要做的是在android應用程序中顯示事件列表並顯示限制,比方說每個查詢只有10個結果,然後我可以執行「加載更多」任務。實現基於日期時間的twitter類時間線查詢事件應用程序

如果我們談論Twitter的時間表,讓我們說的狀態表有以下幾列(PS我做了這些):

  • ID(考慮這是通過自動遞增的主鍵)
  • date_post
  • 鳴叫

如果用戶發佈的tweet,旁邊的自動增量值自動分配的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參數相同。

現在讓我們回到我的應用程序。我有以下的列的表稱爲事件:

  • ID(主鍵,自動遞增)
  • 名(事件的名稱)
  • DATE_START(日期時間它的活動將舉行)

當用戶創建一個事件,該ID將分配有自動遞增的未來價值,但不像我之前提到的鳴叫表,該事件不排序依據日期時間,因爲較大的ID沒有按」 t表示新手r事件,反之亦然。例如:

----- | ----------- | ------------- 
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 with last date_start是2013-05-27 10:00:00

如果我使用前面的查詢,它會產生C,D,E,而不是D ,E和F就像我預料的那樣。

我在這裏失蹤了什麼? 我準備好得到一些建議。謝謝。

回答

0

到目前爲止,我想出了這些解決方案。我在名爲「計數器」的事件表中添加新列,該列將用作具有相同日期時間的事件的計數器。例如,如果我們插入新的事件數據,它將檢查新插入的事件與其他事件的時間。如果相同的日期時間與最大值5的表中,例如,用於新插入的事件計數器的值將被使用5 + 1 = 6分配的I使用觸發器用於這樣做

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 

請讓我知道如果你們對此有更好的方法。謝謝:)