MySQL行排序:如何设置和使用`position`列进行行排序?

时间:2013-03-10 22:35:07

标签: php mysql sql sql-insert

各位大家好!我认为这不应该是一个非常难的 - 但我对MySQL缺乏经验,并且一直有一个棘手的时间来确定正确的方法来做到这一点。我不想最终做些傻事。

所以,我有一个杂货项目列表我的顺序我想转移。
我希望它看起来像这样:

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

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

如何在插入新行时处理position字段?
我自己还是一个 phpMyAdmin 男人,所以我需要简单地安排这个。

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

我认为一旦我将位置列初始化并为新插入的行工作,那么转换它们应该不会太难?我想我会进行“交换”操作,将position字段换成任意两行id。 我想象一个“上移”或“下移”交换操作会抓住position上方或下方的行,然后连续两次UPDATE..来交换{{1} }}的。我不够酷,只想在一个查询中找出如何做到这一点(如果可能的话?),所以从PHP开始我会做多个查询来实现这一点。


我正在显示这样的购物清单:
position


我希望插入类似这样的新行:

SELECT * FROM groceries WHERE 1 ORDER BY position ASC;

如果我无法像INSERT INTO groceries (id, label, position) VALUES (NULL, "Instant Noodles", NULL); 的自动增量那样自动执行position字段,那么我应该将id字段设置为什么,而不是'NULL'?如何插入position与最后添加/最大位置+ 1相同的新行?
我应该运行另一个查询来获取最大的position(或零)并添加1吗?

2 个答案:

答案 0 :(得分:4)

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

INSERT INTO groceries (label, position) 
SELECT "Instant Noodles", COALESCE(MAX(position),0) +1
FROM groceries;

答案 1 :(得分:0)

JW向您展示了如何为新行提供最高价值。另一种方法是将默认值设置为0.这为字段提供了较少工作的值。