2012-03-07 59 views
0

如果我有三个菜单Mysql的重新排序菜单

id | name | order 
-------------------- 
1 | Foo | 1 
2 | Bar | 2 
3 | Blah | 3 

并点击链接menu/up/1,我需要与ID 2设置菜单的顺序与ID 12和菜单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(); 
    } 
} 

回答

1

我不知道你的表定义和键设置,但你可能要对分割重叠第二号人物。如果这是确定的,那么做这样的事情:

最安全:

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 

它使用一个额外的查询,但要安全得多。您也可以验证它不在顶部/底部,因为这会导致问题。

0

检查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功能),并增加了一个那是以前在那个地方。

+0

谢谢,但我需要6查询,或不? – 2012-03-07 01:23:52