1

次のPHPコードがあります:

$result = mysql_query('
            set @num := 0, @type := "";
            UPDATE orders INNER JOIN (
                SELECT id, user_id, created, row_number 
                FROM 
                (
                    SELECT id, user_id, created,
                    @num := if(@type = user_id, @num + 1, 1) AS row_number,
                    @type := user_id AS dummy
                    FROM orders
                    WHERE status = "queue" AND type="order"
                    ORDER BY user_id, created asc 
                ) AS grouped_orders 
                WHERE grouped_orders.row_number <= 2
            ) m ON orders.id = m.id 
            SET orders.status = "process", orders.lock_id = "hash";
        ');

このクエリをスキップ$result = mysql_query('');て PHP MyAdmin パネルにコピー アンド ペーストすると機能しますが、PHP から mysql_query(...) を使用して実行すると、次のエラーが発生します。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE orders INNER JOIN ( SELECT id, user_id, created, row_number FROM' at line 2

括弧を使って何かをしようとしましたが、上/下に移動し、1 行に折りたたまれましたが、うまくいきません...

残念ながら、私が取り組んでいるサーバーにはmysqliがありません。

4

2 に答える 2

0

これを試して:

$result = mysql_query('
            set @num := 0, @type := "";
            UPDATE orders INNER JOIN (
                SELECT id, user_id, created, row_number 
                FROM 
                (
                    SELECT id, user_id, created,
                    @num := if(@type = user_id, @num + 1, 1) AS row_number,
                    @type := user_id AS dummy
                    FROM orders
                    WHERE status = "queue" AND type="order"
                    ORDER BY user_id, created asc 
                ) AS grouped_orders 
                WHERE grouped_orders.row_number <= 2
            ) m ON orders.id = grouped_orders.id 
            SET orders.status = "process", orders.lock_id = "hash";
        ');

グループ順序は、結合する 2 番目のテーブルの名前です

編集:

クエリは問題ないように見えますが (少なくともエラーはありません)、問題は mysql_query を使用している PHP に依存しています。

「mysql_query() は、指定された link_identifier に関連付けられているサーバー上の現在アクティブなデータベースに一意のクエリ (複数のクエリはサポートされていません) を送信します。」 (http://php.net/manual/en/function.mysql-query. php)

したがって、マルチクエリを実行する別の方法が必要であるか、別の解決策を見つける必要があります。攻撃も防ぎ、マルチクエリを実行できるようになるため、mysqli を強制的に使用してみてください....

于 2012-06-07T12:43:08.187 に答える
0

複数のクエリを実行しているので、代わりにマルチクエリを試してくださいmysql_query

編集

select due subselects で変数を定義してみてください。

UPDATE orders INNER JOIN (
      SELECT id, user_id, created, row_number 
      FROM 
      (
           SELECT id, user_id, created,
           @num := if(@type = user_id, @num + 1, 1) AS row_number,
           @type := user_id AS dummy
           FROM orders
           WHERE status = "queue" AND type="order"
           ORDER BY user_id, created asc 
            ) AS grouped_orders, (SELECT @num:=0) r, (SELECT @type:="") t
            WHERE grouped_orders.row_number <= 2
        ) m ON orders.id = grouped_orders.id 
        SET orders.status = "process", orders.lock_id = "hash"; 
于 2012-06-07T12:45:02.423 に答える