【问题标题】:MySQL remember last positionMySQL记住最后一个位置
【发布时间】: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 的另一个过滤

标签: php mysql ajax sql-order-by


【解决方案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 子句的动态就可以了。

    感谢大家的投入!

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 2011-08-07
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多