大家好!我认为这应该不是一个非常困难的问题——但是我对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。这将为该字段提供一个更少工作量的值。