首页  >  问答  >  正文

在MySQL中,如何在按排序列排序的同时考虑数据的时间变化来获取下一行数据?

好的,我的问题有点具体,很难解释。所以我会尽量简化。

我有一个MySQL表格,里面显示着网站上的“提示”。这些提示按照“顺序”列中的整数排序。所以表格看起来像这样:id(int自增),提示(varchar),顺序(int)。

现在,当第一个提示显示给用户时,它会一直显示,直到用户确认,然后显示下一个提示,依此类推。

我想出了一个查询,根据用户上次确认的提示来获取下一个提示:

SELECT hint FROM hints WHERE `order` > $last_seen_item_order ORDER BY `order` DESC LIMIT 1

这个查询很好用。然而,我们有时也需要添加新的提示,通常不是添加在最后一个提示,而是在中间某个位置。所以例如,用户看到了顺序为#6的最后一个提示,但我们在位置#3添加了新的提示。这个新的提示将永远不会显示给这个用户,因为我们已经保存了他已经看过提示#6。

有没有办法来管理这个问题?可能只需要一个或两个MySQL查询吗?

提前感谢任何帮助和提示。

编辑:每个用户都有自己的“已看状态”。我们简单地将其保存在PHP的$_SESSION['last_seen_item_order']中。

P粉420958692P粉420958692377 天前499

全部回复(1)我来回复

  • P粉798343415

    P粉7983434152023-09-08 10:34:15

    您不能按照这种逻辑来管理它。

    为此,您需要维护一个额外的列 - seen 如果用户已经看到了hints,您可以将其设置为1 因此,您的查询将是 -

    SELECT 
       hint 
    FROM
      hints 
    WHERE 
      `order` > last_seen_item_order
       OR seen = 0 
    ORDER BY 
       CASE WHEN `order` > last_seen_item_order THEN `order` END DESC
       CASE WHEN `order` <= last_seen_item_order THEN `id` END ASC
    LIMIT 1

    注意 - 这是我建议的做法。您可以有很多其他的想法。

    编辑 - 如果您想要按用户维护提示,那么您可能有两个选项来维护seen

    1. 为用户维护json格式的已看到提示。
    2. 创建一个名为user_hints_see的单独表,其中包含id(自增)、user_idhint_idseen列。

    回复
    0
  • 取消回复