Mysql的重新排序菜单
问题描述:
如果我有三个菜单Mysql的重新排序菜单
id | name | order
--------------------
1 | Foo | 1
2 | Bar | 2
3 | Blah | 3
并点击链接menu/up/1
,我需要与ID 2
设置菜单的顺序与ID 1
到2
和菜单1
。
我已经试过(PDO)
public static function goDown($id) {
if(!$id) {
return false;
}
self::connect();
self::prepare('SELECT count(*) FROM menu');
$count = self::fetch();
if(isset($count['count(*)'])) {
self::prepare('UPDATE menu SET order = order - 1 WHERE order = :count');
self::bindValue('count', $count['count(*)']);
self::execute();
self::prepare('UPDATE menu SET order = order + 1 WHERE id = :id AND order < :count');
self::bindValue('id', $id);
self::bindValue('count', $count['count(*)']);
return self::execute();
}
}
谢谢!
编辑 - 我的解决方案:
public static function goDown($id) {
if(!$id) {
return false;
}
self::connect();
self::prepare('SELECT count(*) FROM menu');
$count = self::fetch();
if(isset($count['count(*)'])) {
self::prepare('SELECT ordem FROM menu WHERE id = :id LIMIT 1');
self::bindValue('id', $id);
$ordem = self::fetch();
self::prepare('UPDATE menu SET ordem = ordem - 1 WHERE ordem = :ordem');
self::bindValue('ordem', $ordem['ordem'] + 1);
self::execute();
self::prepare('UPDATE menu SET ordem = ordem + 1 WHERE id = :id AND ordem < :count');
self::bindValue('id', $id);
self::bindValue('count', $count['count(*)']);
return self::execute();
}
}
答
我不知道你的表定义和键设置,但你可能要对分割重叠第二号人物。如果这是确定的,那么做这样的事情:
最安全:
SELECT order FROM menu WHERE id = :id; /* One to go up; */
SELECT id, order FROM menu WHERE order = :existingOrder + 1; /* One to go down */
UPDATE menu SET order = order + 1 WHERE id = :id; /* Putting it up */
UPDATE menu SET order = :existingOrder WHERE id = :existingId
它使用一个额外的查询,但要安全得多。您也可以验证它不在顶部/底部,因为这会导致问题。
答
检查this了。
这将是很容易让你把它transalte到PDO:
set @id := 10;
select @count := count(*) from t;
select @prevOrder := least(anorder + 1, @count) from t where id = @id;
select @prevId := id from t where anorder = @prevOrder;
update t set anorder = anorder - 1 where id = @prevId;
update t set anorder = anorder + 1 where id = @id;
基本上它没有倒下减少选择的ID(@id
)的顺序(这是least
功能),并增加了一个那是以前在那个地方。
谢谢,但我需要6查询,或不? – 2012-03-07 01:23:52