我有一个项目表,需要以一定的顺序显示,但该顺序可以更改。可以在开头、结尾或中间添加项目,也可以重新排列项目。如何设置表来跟踪该顺序,使其易于修改,但也可以通过单个查询按顺序获取列表?例如,我可以有一个“NEXT_ID”列来做它的链表样式,但是我如何运行SELECT查询来按照NEXT_ID链的顺序获取行呢?提前为我可能错过的超级明显的解决方案道歉。
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
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;
wlwcrazw3#
如果你想避免排序顺序,你可以尝试一个“父”列,并认为链表是一个特殊的树形结构。这篇文章可能会有所帮助。http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/还有其他文章在那里:http://ferdychristant.com/blog//archive/DOMM-7QJPM7请记住,选择长链表可能会降低性能。
eoxn13cs4#
除非我误解了你在寻找什么,否则你似乎可以添加一个DISPLAY_ORDER列,它是一个数字索引,说明应该如何返回。这可以很容易地改变和重新安排。加号可以按顺序使用。
amrnrhlw5#
最简单的解决方案:使用名为“display_order”的列,在其中设置1、2、3等。查询将使用“ORDER BY display_order”进行排序。要编辑这个(如果你在一个网站相关的环境中),例如使用javascript+和-按钮。每次你这样做+的数字增加,如果有一些与数字存在,它会得到减少,所以他们交换位置。
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;
6条答案
按热度按时间bvjxkvbb1#
我经常遇到这个问题,我用一个简单的方法解决了它:一个名为SortOrder(或DisplayOrder,随你怎么说)的额外列。这使我能够灵活地使用自动生成、自动递增的ID列,并具有特殊的预定义排序。
在我的情况下,我需要他们出来的数据库与字母顺序,除了一些项目,如“其他”和“N/A”总是最后。
wwwo4jvm2#
在表中创建表示排序顺序的列。在此列上放置一个索引,以便MySQL引擎可以根据此列快速进行检索。更改顺序时,请更新此字段中所有记录的值,以保持一致。
例如,在中间插入新记录时:
一些更复杂的东西,比如将#3向下移动到#6,并将所有其他的东西向上滑动:
wlwcrazw3#
如果你想避免排序顺序,你可以尝试一个“父”列,并认为链表是一个特殊的树形结构。这篇文章可能会有所帮助。
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
还有其他文章在那里:http://ferdychristant.com/blog//archive/DOMM-7QJPM7
请记住,选择长链表可能会降低性能。
eoxn13cs4#
除非我误解了你在寻找什么,否则你似乎可以添加一个DISPLAY_ORDER列,它是一个数字索引,说明应该如何返回。这可以很容易地改变和重新安排。加号可以按顺序使用。
amrnrhlw5#
最简单的解决方案:使用名为“display_order”的列,在其中设置1、2、3等。查询将使用“ORDER BY display_order”进行排序。
要编辑这个(如果你在一个网站相关的环境中),例如使用javascript+和-按钮。每次你这样做+的数字增加,如果有一些与数字存在,它会得到减少,所以他们交换位置。
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”形式: