例如,我有一个表,它看起来像这样:
id|name
1|Mike
2|Adam
3|John
4| Sarah…
现在,当我执行查询select * from table order by id desc
时,它将输出如下内容:
4|Sarah
3|John
2|Adam
1|Mike
现在,如果我想上下移动John的行,或者上下移动Adam的行(使用MySQL查询(我需要一个基本的查询,只是想知道从哪里开始),我该怎么办。
我的解决方案:
首先,我创建了另一个名为orderID
的列,它的值与id相同。
下面是一个向上移动用户的示例:
$query = "
SELECT (
SELECT orderID
FROM test WHERE id = 'user id that i want to move up'
) AS user_order,
(
SELECT orderID
FROM test WHERE orderID > user_order
ORDER BY orderID
LIMIT 0,1
) AS nextUser_order
";
$result = mysql_query($query);
$data = mysql_fetch_assoc($result);
$query = "
UPDATE test SET orderID = IF(orderID='{$data[nextUser_order]}',
'{$data[user_order]}', '{$data[nextUser_order]}')
WHERE orderID IN ('{$data[nextUser_order]}', '{$data[user_order]}');
";
$result = mysql_query($query);
有更好的方法吗?
您必须切换ID,或者按另一列排序。这是唯一的办法。
更改id
不是你想做的。你永远不想弄乱你的主键,尤其是因为以后更容易(占用更少的空间,一个是int,另一个是varchar)使用用户的id而不是其他表中的名称来引用你的用户,有一个你知道永远不会更改的字段是很好的。
将另一个字段(如order
)作为floating point
编号。
在bar
和foobar
之间移动foo
时,将foo
的order
设置为bar
的average
和foobar
的order
。
您可以将任意值放入查询中的order by
子句中,但对于简单的"向上/向下移动一行"类型的东西,没有一个值可以轻松工作。您可以强制某些值排在第一位或最后一位,但不能"将该值放在该值之后,而是让该值进入其自然位置"。您需要有一个额外的字段来指定排序顺序。
SQL表并不是天生有序的,它们的行为实际上就像一个"行袋"。如果您希望结果按特定顺序排列,则在将它们从包中取出时需要对它们进行排序(使用ORDER BY ...
)——否则,SQL server将按它认为最简单的顺序返回它们。(在这种情况下,它们的出现顺序与您插入它们的顺序相反,但这根本不能保证。)
您应该使用另一列来保存显示顺序。id只是一个唯一的标识符。在关系数据库中,由于相关表的更新,上下移动行可能会导致大量查询,因此我坚持为此定义一个特殊行的想法。