2013-03-12 118 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

相关问题