【问题标题】:Creating a linked list or similar queue in MySQL?在 MySQL 中创建链表或类似队列?
【发布时间】:2011-03-19 18:55:17
【问题描述】:

我有一个需要按特定顺序显示的项目表,但可以更改该顺序。可以在开头、结尾或中间添加项目,并且可以重新排列项目。如何设置表以跟踪该顺序,以便易于修改,但也可以通过单个查询按顺序获取列表?

例如,我可以有一个“NEXT_ID”列来执行链表样式,但是我将如何运行 SELECT 查询以按 NEXT_ID 链的顺序获取行?

为我可能遗漏的超级明显的解决方案提前道歉。

【问题讨论】:

标签: mysql queue linked-list


【解决方案1】:

如果您想避免排序顺序,可以尝试“父”列,并将链表视为树状结构的特殊情况。这篇文章可能会有所帮助。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

还有其他文章: http://ferdychristant.com/blog//archive/DOMM-7QJPM7

请记住,选择长链表可能会降低性能。

【讨论】:

  • 感谢您指出。我通过 mysql 站点报告了一个断开的链接。我不希望收到甲骨文的回复。
【解决方案2】:

我经常遇到这个问题,我用一个简单的解决方案解决了这个问题:一个名为“排序顺序”的额外列(或 DisplayOrder,不管你真正喜欢什么)。这让我可以灵活地使用自动生成、自动递增的 ID 列并进行特殊的预定义排序。

在我的情况下,我需要它们按字母顺序从数据库中出来,除了“其他”和“不适用”等某些项目总是最后。

ProdID ProdText SortOrder
2      "Anchovies"    1
3      "Rivet"        2
4      "N/A"          4
5      "Other"        3

SELECT ProdID, ProdText ORDER BY Sort Order

【讨论】:

  • 嗯,我希望我不必为单个移动或插入更新所有/几条记录。但根据下面的答案,MySQL 中可能不存在。
  • @NChase:我还没有在 SQL 中找到这样的功能
【解决方案3】:

最简单的解决方案:使用名为“display_order”的列,在其中设置 1、2、3 等。查询将使用“ORDER BY display_order”进行排序。

要编辑它(如果您在与网站相关的环境中),请使用带有 + 和 - 按钮的 javascript。每次你这样做 + 数字都会增加,如果存在有数字的东西,它会减少,所以他们会切换位置。

【讨论】:

    【解决方案4】:

    在表中创建一个表示排序顺序的列。在该列上放置一个索引,以便 MySQL 引擎可以根据该列快速检索。当您更改顺序时,请更新此字段中所有记录的值以保持一致。

    例如,当你在中间插入一条新记录时:

    更新表 SET sort_order = sort_order + 1 WHERE sort_order >= 5; INSERT INTO table (sort_order, column1, column2) VALUES (5, 'value1', 'value2');

    更复杂的事情,比如将 #3 向下移动到 #6 并将所有其他的向上滑动:

    更新表 SET sort_order = Case sort_order When 3 Then 6 Else sort_order - 1 End WHERE sort_order BETWEEN 3 和 6;

    【讨论】:

      【解决方案5】:

      除非我误解了您要查找的内容,否则您似乎可以添加一个 DISPLAY_ORDER 列,该列是应如何返回事物的数字索引。这可以很容易地更改和重新排列。加值可以按顺序使用。

      【讨论】:

      • 我希望我只需要更新正在移动/插入的记录,而不是通过整个 sortOrder 级联更改,但这听起来可能是不可能的。
      • 嗯,这不一定是全部。它只影响正在更改的范围之间的记录。例如,如果您将索引为 3 的记录下移至 7,那么您只会更新 3 到 7 之间的记录。无需更改任何其他内容。
      猜你喜欢
      • 2017-01-17
      • 2017-06-17
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多