通过 SQL 读取下一条/上一条记录
Posted
技术标签:
【中文标题】通过 SQL 读取下一条/上一条记录【英文标题】:Read Next/Previous record via SQL 【发布时间】:2014-12-20 08:53:31 【问题描述】:我有一个简单的客户端数据库(使用 mysql)。该应用程序一次读取一条记录。我希望能够单击按钮阅读下一个或阅读上一个。
我没有找到的记录的记录集。一次只能找到一条记录。
使用 SURNAME+FIRSTNAME+CLIENTID 键保证记录的唯一性。
要阅读下一条记录,我执行以下操作(效果很好)。这假设我已经阅读了一条记录,所以我知道它的当前姓氏+给定名称+clientid,因此获取 NEXT 记录只是选择一个“大于”当前记录的记录(代码如下所示)。
"select * from Clients where concat(Surname,GivenName,ClientID) > '" & SearchKey & "' ORDER BY Surname, GivenName, ClientID LIMIT 1"
如果我有两条记录“David Morris”和“David Morrison”,则上面的 NEXT 记录逻辑可以正常工作。但是我该如何阅读之前的记录呢?
示例:假设我在数据库中有以下 6 条记录。
Morris, Alan
Morris, Barry
Morris, Charlie
Morris, David
Morrison, Andrew
Morrison, Brendon
我知道我想处理客户记录,我“认为”他的姓是 Morrison(不知道他的名字)。我想调出第一条“Morrison”唱片,然后按向下翻页(或向上翻页),直到找到我想要的唱片。使用我的示例 6 记录,我会找到的第一个是 Morrison-Andrew。我可以向下按页面,我会找到 Morrison-Brendon。但这不是我想要的客户。所以我改为向上翻页,现在向后退。从莫里森-布伦登,到莫里森-安德鲁,再到莫里森-大卫。现在我有了我想要的唱片。莫里斯-大卫。
如果我使用带有“.....LIKE 'MORRISON%'....”的选择语句,那么我将无法向后翻页以找到 Morris-David。
现在我总是可以告诉客户以不同的方式使用应用程序,但这是他希望它工作的方式。
我已经尝试过使用带有 DESC 序列的 ORDER BY,但我还没有找到合适的模式。
提前感谢您提供的任何建议。
大卫。
【问题讨论】:
您尝试使用哪种语言访问数据库? 此 where 子句不太可能可索引:where concat(Surname,GivenName,ClientID)
如果此查询经常运行,您可能希望生成计算列并为其编制索引(或使用函数索引,如果可用)。
通常是where concat(Surname,GivenName,ClientID) < value ORDER BY Surname desc, GivenName desc, ClientID desc LIMIT 1
这似乎是一种奇怪的数据库使用方式。一般来说,我认为您只想使用 select * from clients where [some condition] order by surname, givenname, client_id 或类似的东西。你能解释一下更大的背景吗?那么也许我们可以给你一个更好的答案。还有为什么不使用 <.>
为什么没有唯一的 id 列?
【参考方案1】:
我找到了答案。我没有意识到您可以使用 CONCAT() 作为 ORDER BY 子句的一部分。
下一步按钮
select * from Clients where concat(Surname,GivenName,ClientID) > '" & SearchKey & "' ORDER BY concat(Surname, GivenName, ClientID) LIMIT 1
上一个按钮
select * from Clients where concat(Surname,GivenName,ClientID) < '" & SearchKey & "' ORDER BY concat(Surname, GivenName, ClientID) DESC LIMIT 1
【讨论】:
以上是关于通过 SQL 读取下一条/上一条记录的主要内容,如果未能解决你的问题,请参考以下文章