-1

我有一个查询,可以让我更改用户订单。

这是我的查询:

  update test set orderID = 
      case orderID
        when (select orderID from ( select * from test where orderID > ( select orderID from test where id = 'id I want to move up' ) limit 1) as nextOrderID ) then ( select orderID from ( select * from test where id = 'id I want to move up') as nextOrderID ) 
        when ( select orderID from ( select * from test where id = 'id I want to move up' ) as nextOrderID )  then (select orderID from ( select * from test where orderID > ( select orderID from test where id = 'id I want to move up' ) limit 1) as nextOrderID )
      else
        orderID
      end 

我想知道执行该查询是否不会花费很多时间,如果会,如何使其加载更快,是否可以减少该查询?

更新:

我对代码进行了一些编辑,所以现在我认为它会更快地执行查询。这是代码的一部分:

$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);
4

3 回答 3

2

我想知道执行该查询是否不会花费很多时间,

呃...你的意思是你想知道查询是否需要很多时间来执行?当然比它需要的更多——但很大程度上取决于您的数据库结构、其中的数据以及您对“大量时间”的定义。

查询是一个可怕的混乱。撇开查询的不必要的复杂性不谈,这也是错误的——您使用 LIMIT 来检索列表中的下一个条目,而没有定义该列表应如何排序。

看起来它应该改变列表的顺序。这会更明智(假设 orderID 是唯一的):

 DELIMITER $$

 CREATE PROCEDURE bubble_up(IN p_selected INTEGER)
 BEGIN
     DECLARE l_selected_seq INTEGER;
     DECLARE l_replaced_seq INTEGER;

     SELECT orderID into l_selected_seq 
     FROM test 
     WHERE id=p_selected;

     IF (l_selected>1) THEN
        SELECT orderID INTO l_replaced_seq
        WHERE orderID>l_selected_seq
        ORDER BY orderID
        LIMIT 0,1;

        -- swap the values
        UPDATE test SET orderID = IF(orderID=l_replaced_seq, 
                    l_selected_seq, l_replaced_seq)
        WHERE orderID IN (l_replaced_seq, l_selected_seq);
     END IF
 END$$
于 2011-06-17T11:29:55.033 回答
0

查询的逻辑不是太多了吗?我会使用一些代码来实现结果......

如果出于某种原因被迫进行复杂的 mysql 查询,您可以发布表的 desc 吗?首先我会尝试解释选择,以确保我有必要的索引......

于 2011-06-17T10:16:42.033 回答
0

我看到了一些问题,但我认为最大的问题是您正在更新所有表格,而我看到您实际上只需要更新特定行。您应该在 UPDATE 语句中添加 WHERE 子句,以防止您不需要更新的行锁定(和更新)。

于 2011-06-17T10:40:52.763 回答