【发布时间】:2017-03-30 02:53:01
【问题描述】:
我有一张食物表。他们有一个“位置”字段,表示他们应该出现在列表中的顺序(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 的东西时,每个人都在说要避免多个查询并避免进行同步编码之类的东西。
谢谢
【问题讨论】:
-
你想要什么结果..
-
@reds 当我想将“Pears”移到“Chips”之前,让我的桌子看起来像我的问题中的第二个示例
-
您想让梨子成为您的第二行记录吗?你是这个意思吗?
-
@reds - “Pears”不一定需要移动记录。因为两者之间可能有任意数量的不相关记录。我只需要更改“位置”字段,并且任何相关记录的“位置”字段相应增加。
-
@reds 我稍微更新了我的问题,希望我现在要问的内容更清楚一点。