【问题标题】:mySQL Append to LIstmySQL 追加到列表
【发布时间】:2016-05-29 18:19:32
【问题描述】:

我有一个从 mySQL 输出的列表,其中包含 20 个项目。

用户将添加和删除进入列表的项目,因此项目的 ID 不连续。它们可能是 5、10、12、13、14、27、28、31、38、40。列表仅限于 20 项。

SELECT * FROM table WHERE fields = vars ORDER BY id DESC LIMIT 0,10

当此列表显示在屏幕上时,用户将继续添加和删除项目。我这里的例子中最后一个id的值是40。

其中一些项目可能会被删除,并且会添加新项目。

如何从最后一个已知 id 开始重新运行此查询。我是否添加了 WHERE ID > 40。我可以将 WHERE 子句放在 LIMIT 0,10 子句之后。

SELECT * FROM table WHERE fields = vars ORDER BY id DESC LIMIT 0,10 WHERE id > $lastid

这里的要点是我不想显示已经显示的项目,并且我不知道项目是否已被删除,因此执行 1,10 可能会导致错误的结果。我需要紧跟最后一个显示项目之后的下 10 个结果。

【问题讨论】:

  • 我认为您不应该担心已删除的项目。根据项目的修改来控制是否应该显示项目将是一个真正的痛苦。您应该坚持 id 的顺序并为每个页面修复一些元素。然后您只需要使用LIMIT 子句控制这些值。始终以LIMIT 1, 10 开头,10 是页面的元素数,下一页将是 1+10,10 即LIMIT 11,10。所有的分页都是这样工作的。控制应该显示的内容将涉及给您的系统增加不必要的复杂性,例如 cookie、其他表格
  • 还有一个糟糕的逻辑来检查每个看到列表等等的用户,每个用户在分页中前进和后退的每一步。
  • 我没有将其添加为答案,因为这是一种意见,尽管知道这是几乎所有系统的默认行为。
  • 我完全了解分页,我让它在几个搜索页面上运行。这是一个附加在项目屏幕下方的列表,并在列表底部附加了一个链接,我想添加一个滚动触发器,以便当用户点击页面底部时,它会自动启动附加。我不能让项目重复,因为以前的项目已被删除。
  • 所以,说这不是一个糟糕的逻辑,它的用户界面要求是向下滚动屏幕,而不是在页面之间来回切换。

标签: mysql


【解决方案1】:

保存上次检索到的id 值,并在现有的 WHERE 子句中添加一个条件。 (不能在 LIMIT 之后添加第二个 WHERE 子句,这是无效的。SELECT 语句只有一个 WHERE 子句。)

我有点困惑,因为问题中的查询显示按 id 以 DESCENDING 顺序排序。在这种情况下,您可能希望下一个 id 值小于最后检索到的值。

如果您是按升序排序,那么...

SELECT t.*
  FROM table t
 WHERE t.fields = vars
   AND t.id > ? 
 ORDER BY t.id ASC 
 LIMIT 10

问号有一个绑定占位符...假设您使用的是准备好的语句。如果您不使用准备好的语句,则使用文字代替绑定占位符...您上次检索的值。

如果您按 id 降序排序,那么您可能希望检索 id 值小于您之前检索的最后一个的行。

保存检索到的最后一行的 id 值一点也不难,将其放入网页上的隐藏输入中,并在表单发布时将其读回。 (忽略 Jorge Campos 的错误建议。)

【讨论】:

  • 谢谢。你刚刚让我意识到了一些我没有想到的事情。我把它们按降序排列,因为最后一个放在屏幕顶部。我将不得不追加到列表的顶部,并将旧结果推到屏幕下方。否则我将不得不更改订单。最好保留新条目。有什么可以和别人讨论的。我还注意到您将 0,10 取出并保留为 10,无需在已知返回 10 时分页。在我的情况下,它是 50 或 100。
  • 我还有最后一个问题。假设只有一个 where 子句,它可以在 LIMIT 10 之后。select * from table order by id desc limit 10 where id > lastid 是一个有效的语句,还是需要在 order 和 limit 之前。
  • WHERE 子句不能在 ORDER BY 子句之后,也不能在 LIMIT 子句之后。在该示例中,WHERE 子句需要位于表列表之后和 ORDER BY 之前。你的陈述中只有一个地方可以去。 MySQL 语法对 SELECT 语句中子句的顺序非常具体。
  • LIMIT 10LIMIT 0,10 相同。 (跳过前零行,并返回(最多)接下来的十行。
  • 非常感谢,我现在掌握了我需要调查的内容。还有一些 javascript 要查看以将 ajax 调用附加到容器。感谢您的确认,我正朝着正确的方向前进。只是有点面子问题。
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2021-01-09
  • 2013-11-08
  • 2020-08-08
  • 2012-12-10
相关资源
最近更新 更多