MySQL行排序:如何设置和使用“位置”列进行行排序


MySQL Row Ordering: How to set up and use a `position` column for row ordering?

大家好!我认为这应该不是一个非常困难的问题——但是我对MySQL没有经验,并且一直在寻找正确的方法来做到这一点。我不想最后做一些愚蠢的事情。

那么,我有一个杂货商品列表,我想改变它们的顺序。
  我希望它看起来像这样:

id    label    position
--    -----    --------
81    Bread    1
82    Soup     2
83    Ham      3
84    Eggs     4

如何以这种方式初始化 position 列?

当插入新行时,我如何处理position字段?
我仍然是一个phpMyAdmin男人自己,所以我需要这是奠定了相当简单。

最初,我认为我可以只是auto_increment position列就像id一样-希望它能作为我的初始排序位置-但我显然不允许,因为只有id是。

我认为一旦我有位置列初始化,并为新插入的行工作,移动他们周围不应该太难吗?我想象我将做一个"交换"操作,通过id交换position字段的任何两行。
  我想象一个"上shift-up"或"下shift-down"交换操作会抓住position上面或下面的行,然后做两个连续的UPDATE..来交换position。我不够酷,不能弄清楚如何在一个查询中简单地做到这一点(如果可能的话?),所以从PHP我将做多个查询来完成这一点。


我像这样显示购物清单:
SELECT * FROM groceries WHERE 1 ORDER BY position ASC;


我希望插入新的行像这样:

INSERT INTO groceries (id,    label,              position) 
VALUES                (NULL,  "Instant Noodles",  NULL);

如果我不能像id的自动增量一样自动化position字段,那么而不是'NULL',我应该/可以设置position字段为什么?我如何插入与最后添加/最大位置+1相同的position的新行?
  我是否应该运行另一个查询来获取最大的position(或零)并添加1?

由于在一个表中只能设置一个auto_increment列,因此可以使用INSERT INTO...SELECT语句来增加位置的最大值。

INSERT INTO groceries (label, position) 
SELECT "Instant Noodles", COALESCE(MAX(position),0) +1
FROM groceries;
    <
  • SQLFiddle演示/gh>

JW向您展示了如何为新行提供最大值。另一种方法是将默认值设置为0。这将为该字段提供一个更少工作量的值。