2013-03-12 89 views
0

我想從我的數據庫中按照字母(asc或desc)順序的姓氏字段從sqlite中檢索下一個或上一個記錄。但是,姓氏不是唯一的字段,我也只能爲每個查詢檢索一條記錄(LIMIT 1),因爲我使用的是sqlite的回調機制,而且我不想緩衝返回的每個可能結果的結果從查詢中(除非沒有其他選項)。我還有一個名爲customerId的唯一字段(即行ID)。如何獲取具有相同姓氏的下一條記錄

這是我目前使用的語句:

stream << "select * from customerTable where LastName >= '" << customerLastName << "' order by LastName asc limit 1"; 

我嘗試了一些其他的語句,如:

stream << "select * from customerTable where LastName >= '" << customerLastName << "' and CustomerId != " << customerId << " order by LastName asc limit 1"; 

但是這一個保持與相同的姓氏2個記錄之間翻轉。

所以我需要找到一個技巧,無論何時姓氏相同或不相同,都會給我下一個(或前一個記錄)。

+0

我可能會錯過這裏,但爲什麼不使用'SELECT DISTINCT'? – NPE 2013-03-12 10:36:32

+0

我不熟悉獨特的,我需要檢查一個出 – 2013-03-12 10:37:35

+0

不同的參數是過濾重複,這不是我想要的,我仍然希望從數據庫中檢索每個記錄。但是由於我當時只檢索一條記錄,因此我需要能夠以上一條記錄作爲起點檢索下一條記錄。所以,如果姓氏相同,我需要能夠檢索它或跳到下一個姓氏,如果它與以前的姓氏不同。在我的程序中,我使用箭頭上下按照姓氏的字母順序瀏覽存儲在數據庫中的客戶。 – 2013-03-12 10:42:18

回答

2

一個更容易的方式來獲得所有的唯一名稱是通過使用SELECT DISTINCT

select distinct LastName from customerTable order by LastName asc 

這會給你按字母順序排列的所有唯一的名稱。

+0

對不起NPE,我想根據他們的姓氏按字母順序瀏覽所有客戶,並顯示他們的詳細信息(通過向上或向下按箭頭鍵)。我不想過濾掉重名的客戶,但問題是在sql語句中使用LIMIT 1,因爲我使用sqlite的回調函數來處理查詢結果。 – 2013-03-12 10:57:13

0

如果您堅持使用限制爲1的查詢,而您仍然希望查詢具有相同姓氏的所有記錄,那麼您可以繼續使用第二種方法,即使它有點奇怪。在查詢and CustomerId !=的第二條記錄後,您將不得不用and CustomerId not in (firstId, secondId)等查詢下一條記錄。

但是,你真的不應該這樣。乾淨的方法是首先準備一個語句(也使用主機變量而不是字符串連接!),然後調用sqlite_step(),直到檢索到所有記錄。

+0

你明白了麥克。我的問題起源於嘗試瀏覽記錄,同時限制結果時僅記錄一條記錄。然後我不需要緩存結果並在以後解析。但是,現在在限制我姓氏的情況下是一樣的。我會盡力找到一份工作。 – 2013-03-12 11:07:43

+0

你真的應該改變你的方法,放下限制並保持光標打開。 – firefrorefiddle 2013-03-12 11:15:29

+0

問題解決了,我首先使用以下查詢來查看是否有另一個客戶具有相同的姓氏:stream <<「select * from customerTable where LastName =='」<< customerLastName <<「和CustomerId>」<< customerId <<「order by customerId asc limit 1」;如果這沒有給我一個新的customerId,我使用以下查詢:stream <<「select * from customerTable where LastName>'」<< customerLastName <<「'by LastName asc limit 1」; – 2013-03-12 11:48:43

相關問題