我正在为摄影师编码一个网站,目前正在研究图库的实现。 我需要能够从n.a点开始一行并将其移至n.b点 这是原始表的示例:
|gallery_img |
|--------------------------|
| id | fk_gal | fk_img | o |
| | | | |
| 0 | 16 | 240 | 1 |
| 1 | 16 | 322 | 2 |
| 2 | 27 | 240 | 1 |
| 3 | 16 | 245 | 3 |
| 4 | 16 | 210 | 4 |
| 5 | 27 | 530 | 2 |
所有字段均为INT(11)。 'id'自动递增。 “ fk_gal”和“ fk_img”通过FOREIGN_KEY链接到其他不相关的表。
现在,“ o”是我关注的领域。它确定图像在网站上显示的顺序。该值对于每个表必须始终是唯一的。要澄清的是,如果我仅调用一个表,则每行中的“ o”应该不同。但是,如果我调用整个表,则“ o [0]”可能会重复出现几次。
这就是我所需要的。首先,我一次只会在一个图库上运行此功能,因此将从此处开始的所有表格视觉效果都将通过“ SELECT * FROM gallery_img WHERE fk_gal = 16”进行过滤。 我需要将'o'从n更改为n2,以将其有效地移动到数据库中。
|gallery_img |
|--------------------------|
| id | fk_gal | fk_img | o |
| | | | |
| 0 | 16 | 240 | 1 |
| | | | | <--
| 1 | 16 | 322 | 2 |+ |
| 3 | 16 | 245 | 3 |+ |
| 4 | 16 | 210 | 4 | --|
代码需要将所需的行(在此示例中为'o = 4')移至1,同时将所有接下来的行向下移,以防止再次发生。 这是我现在拥有的代码。我正在通过PHP编写MySql脚本。 我在这里使用$ n变量。它包含以下数据:
$ n = array(gallery_id,img_id,target_o);
sql("UPDATE gallery_img SET o = o + 1 ORDER BY o ASC LIMIT ". ($n[2] - 1) .", 18446744073709551615;");
sql("UPDATE gallery_img SET o = ". ($n[2] + 2) ." WHERE fk_img = $n[1] AND fk_gal = $n[0];");
我遇到的问题是,当我执行它时,会得到以下两个输出之一:
|gallery_img |
|--------------------------|
| id | fk_gal | fk_img | o |
| | | | |
| 0 | 16 | 240 | 1 |
| 4 | 16 | 210 | 1 | <-- Shouldn't be duplicate
| 1 | 16 | 322 | 2 |
| 3 | 16 | 245 | 3 |
|gallery_img |
|--------------------------|
| id | fk_gal | fk_img | o |
| | | | |
| 0 | 16 | 240 | 1 |
| 4 | 16 | 210 | 2 |
| 1 | 16 | 322 | 4 |-|
| 3 | 16 | 245 | 4 | |-- Shouldn't be duplicate
| 5 | 16 | 273 | 4 | |
| 6 | 16 | 14 | 4 |-|
这样思考的好方法:
UPDATE
如果您有任何疑问,请告诉我! 提前感谢您的帮助!
答案 0 :(得分:2)
因此,如果您想将WHERE o=4
行更改为o=1
,则增加要替换的数字和所有更大的数字。
UPDATE gallery_img SET o = (o + 1) WHERE o >= 1
然后更新您要成为的行o=1
:
UPDATE gallery_img SET o = 1 WHERE fk_img = something1 AND fk_gal = something2
或者,如果您只知道o
,请使用o=(4+1)
,因为它在上次UPDATE中已更改:
UPDATE gallery_img SET o = 1 WHERE o = 5
答案 1 :(得分:2)
我可以建议黑客吗?对于列o
,不要使用整数,而应使用DOUBLE PRECISION
。
仅通过平均上一行和下一行的值,在两行之间插入一行会容易得多。如果您需要在3
和4
之间插入,则只需插入带有3.5
的行即可。
当然,经过一段时间(至少50次之后),您希望重新编号这些值,因为DOUBLE PRECISION
的尾数为53位。