我有一张食物表。他们有一个“位置”字段,表示应该在列表中显示的顺序(listID是他们所在的列表,我们不想对另一个列表上的项目重新排序)。
+--id--+--listID--+---name---+--position--+ | 1 | 1 | cheese | 0 | | 2 | 1 | chips | 1 | | 3 | 1 | bacon | 2 | | 4 | 1 | apples | 3 | | 5 | 1 | pears | 4 | | 6 | 1 | pie | 5 | | 7 | 2 | carrots | 0 | | 8,9+ | 3,4+ | ... | ... | +------+----------+----------+------------+ 我希望能够说出“将梨移到切屑之前”,这涉及将梨的位置设置为位置1,然后将其之间的所有位置增加1。
+--id--+--listID--+---name---+--position--+ | 1 | 1 | cheese | 0 | | 2 | 1 | chips | 2 | | 3 | 1 | bacon | 3 | | 4 | 1 | apples | 4 | | 5 | 1 | pears | 1 | | 6 | 1 | pie | 5 | | 7 | 2 | carrots | 0 | | 8,9+ | 3,4+ | ... | ... | +------+----------+----------+------------+ 这样我所要做的就是SELECT name FROM mytable WHERE listID = 1 ORDER BY position以正确的顺序获取所有食物。
是否可以通过单个查询执行此操作?请记住,一条记录可能在列表中上移或下移,并且该表包含多个列表的记录,因此我们需要隔离listID。
我对SQL的了解非常有限,因此,现在我唯一知道的方法就是SELECT id, position FROM mytable WHERE listID = 1 AND position BETWEEN 1 AND 5可以使用Javascript(node.js)将位置5更改为1,并将所有其他位置+1递增。然后更新我刚刚更改的所有记录。
只是在我每次尝试阅读SQL内容时,每个人都一直在说以避免多种查询,并避免进行同步编码和类似的事情。
谢谢
这需要更新许多记录的复杂查询。但是,对数据进行小的更改可能会改变事情,因此可以通过仅修改一条记录的简单查询来实现。
UPDATE my_table set position = position*10; 在过去,许多系统上的BASIC编程语言都有行号,因此鼓励使用spagetti代码。许多人写的不是功能,而是功能GOTO line_number。如果您按顺序对行进行编号并且必须添加或删除几行,则会出现真正的麻烦。人们如何解决它?通过增加10行!这就是我们在这里所做的。
因此,您想让梨成为第二项吗?
UPDATE my_table set position = 15 WHERE listId=1 AND name = 'Pears' 担心最终物品之间的间隙会在多次重新排序后消失吗?无所畏惧
UPDATE my_table set position = position*10; 时。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。