在MySQL中创建链表或类似的队列?

nkkqxpd9  于 2023-05-16  发布在  Mysql
关注(0)|答案(6)|浏览(106)

我有一个项目表,需要以一定的顺序显示,但该顺序可以更改。可以在开头、结尾或中间添加项目,也可以重新排列项目。如何设置表来跟踪该顺序,使其易于修改,但也可以通过单个查询按顺序获取列表?
例如,我可以有一个“NEXT_ID”列来做它的链表样式,但是我如何运行SELECT查询来按照NEXT_ID链的顺序获取行呢?
提前为我可能错过的超级明显的解决方案道歉。

bvjxkvbb

bvjxkvbb1#

我经常遇到这个问题,我用一个简单的方法解决了它:一个名为SortOrder(或DisplayOrder,随你怎么说)的额外列。这使我能够灵活地使用自动生成、自动递增的ID列,并具有特殊的预定义排序。
在我的情况下,我需要他们出来的数据库与字母顺序,除了一些项目,如“其他”和“N/A”总是最后。

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

SELECT ProdID, ProdText ORDER BY Sort Order
wwwo4jvm

wwwo4jvm2#

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

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

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

UPDATE table
SET sort_order = Case sort_order When 3 Then 6 Else sort_order - 1 End
WHERE sort_order BETWEEN 3 AND 6;
wlwcrazw

wlwcrazw3#

如果你想避免排序顺序,你可以尝试一个“父”列,并认为链表是一个特殊的树形结构。这篇文章可能会有所帮助。
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
还有其他文章在那里:http://ferdychristant.com/blog//archive/DOMM-7QJPM7
请记住,选择长链表可能会降低性能。

eoxn13cs

eoxn13cs4#

除非我误解了你在寻找什么,否则你似乎可以添加一个DISPLAY_ORDER列,它是一个数字索引,说明应该如何返回。这可以很容易地改变和重新安排。加号可以按顺序使用。

amrnrhlw

amrnrhlw5#

最简单的解决方案:使用名为“display_order”的列,在其中设置1、2、3等。查询将使用“ORDER BY display_order”进行排序。
要编辑这个(如果你在一个网站相关的环境中),例如使用javascript+和-按钮。每次你这样做+的数字增加,如果有一些与数字存在,它会得到减少,所以他们交换位置。

db2dz4w8

db2dz4w86#

您可以将“display_order”字段定义为Double,然后使用该字段中的最大值加1作为默认值。然后,当您需要将一行放在另外两行之间时,可以使用公式(row1.display_name + row2.display_name)/2。
例如,假设该表如下:
| 身份证|显示命令|
| --------------|--------------|
| 1| 1.0分|
| 二|2.0|
要在1和2之间放置一行,display_order字段应设置为(1+2)/2 = 1.5
| 身份证|显示命令|
| --------------|--------------|
| 1| 1.0分|
| 三|一点五|
| 二|2.0|
之后,您可以选择运行以下查询,将数字恢复为“int”形式:

SET @rank:=0;
UPDATE table_name
SET display_order=@rank:=@rank+1
ORDER By display_order;
身份证显示命令
11.0分
2.0
3.0

相关问题