-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

いくつかの問題が見られますが、最大の問題は、実際には特定の行のみを更新する必要があるのに、すべてのテーブルを更新していることだと思います。UPDATE ステートメントに WHERE 句を追加して、更新する必要のない行がロック (および更新) されないようにする必要があります。

于 2011-06-17T10:40:52.763 に答える
0

クエリのロジックが多すぎませんか? 結果を達成するためにいくつかのコードを使用します...

複雑な mysql クエリを強制する何らかの理由がある場合は、テーブルの説明を投稿できますか? まず、必要なインデックスがあることを確認するために、選択の説明を試みます...

于 2011-06-17T10:16:42.033 に答える