MySQL记住最后一个位置

Posted

技术标签:

【中文标题】MySQL记住最后一个位置【英文标题】:MySQL remember last position 【发布时间】:2012-10-07 09:41:45 【问题描述】:

我制作了一个小应用程序,其中向用户显示了一个数据表。数据可以按不同的列标题排序,并使用输入进行过滤。

当用户点击一行时,它会打开一个小弹出窗口,其中包含两个箭头,用于转到下一条和上一条记录,其顺序与它们在表格中出现的顺序相同。

最初我有(例如“以前”):

SELECT ed.id
FROM entity_details AS ed, users
WHERE ed.id > ?
AND ed.typeRef = ?
AND ed.ownerRef = users.id
$filter
$SQLOrder LIMIT 1

如果表格按 ed.id 排序,这可以正常工作,但如果按另一列排序,则无法正常工作,例如ed.name,因为下一个字母名称可能有更高或更低的 id。

仅供参考 $filter 可能类似于:

AND branchRef = 2

$SQLOrder 可以是:

ORDER BY ed.name DESC

在尊重当前顺序和记录位置的情况下,我需要做什么才能使其正确循环记录?


所有的排序和过滤参数都通过 AJAX 来实现,例如:

$JSON->selectedbranch ;

我得出的结论是,我只需要知道如何从 X 列包含值 Y 的行开始查询,这可能吗?

【问题讨论】:

为什么你的 $SQLOrder 起过滤作用而不是排序作用? 我不确定,但你能告诉我你的排序代码在哪里吗?因为,如上所述,您的 $SQLOrder 只是 ed.name 的另一个过滤 【参考方案1】:

您应该存储显示的行号,而不是 ID。然后只需按照您的应用程序要求在 SQL 中进行排序,然后应用此处包含的知识:

Skipping first n results in mysql

为了简化工作,并使这个答案对未来的 SO 居民有用:

SELECT ed.id 
FROM entity_details AS ed, users 
WHERE ed.typeRef = ? 
AND ed.ownerRef = users.id 
$filter 
$SQLOrder 
LIMIT $currentRowNum,1

但是,这种方案有异味:使用它来导航您的行意味着每个导航操作都有一个 SQL 查询。这可能会对您的响应时间产生不良影响...

【讨论】:

我相信限制条款是:LIMIT $currentRowNum, 1。定义为LIMIT [offset,] row_count 如何获取行号而不是 ID 等其他内容? @imperium2335 您应该“牢记在心”...我不熟悉您的应用程序,但我想我会使用 javascript 变量来存储它,并将其作为执行查询的 php 脚本的参数。鉴于使用了 Ajax,它有可能毫无困难地工作。如果您想在“真实”导航操作之间保留其状态,则必须注意这一点。【参考方案2】:

PHP 的 mysql_data_seek 函数可能会有所帮助。

mysql_data_seek

【讨论】:

【参考方案3】:

我找到了,看到其他人的回答给了我一个想法,但他的回答消失了:(

对于下一个按钮,我有:

$result = $dbh->prepare("SELECT ed.id
FROM entity_details AS ed, users
WHERE $WHERE < ?
AND ed.typeRef = ?
AND ed.ownerRef = users.id
$filter
ORDER BY ed.name DESC LIMIT 1") ;

$WHERE 只是列名“ed.name”。

我只需要理清 $where 和 ORDER BY 子句的动态就可以了。

感谢大家的投入!

【讨论】:

以上是关于MySQL记住最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章

带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置

python 让plt.show记住最后一个数字位置和上一次的情节。

怎样让XP系统记住上次打开窗口的大小和位置?

在 Windows 中重置打开文件对话框的位置

VC6 正在记住一个 ActiveX 控制器使用的 dll 位置,但我找不到更改它的位置

记住智能手机当前位置的选择