0

1 つのUPDATEクエリだけSETで、SQL クエリの結果に基づいて値を取得できますか?

これは私が念頭に置いているクエリであり、機能しません:

UPDATE items SET itemcode=CONCAT('XYZ',(SELECT COUNT(*) as ctr FROM items
       WHERE itemcode!=''),'GZ') WHERE itemid=123;

これは実際のクエリではありませんが、1 つのクエリを使用する目的は、2 つのクエリを連続して実行しようとしたときに競合状態を防ぐことです。

テーブルにレコードを挿入しitemsたら、作成したアイテムの一部を更新し、増加するアイテム コードを入力する必要があります。したがって、空のテーブル内のアイテムの数に依存しますitemcode

4

3 に答える 3

2

競合状態を適切に回避するにはLOCK TABLE、およびトランザクションを使用して、一貫した結果を保証します。

あなたのクエリで

UPDATE items SET itemcode=CONCAT('XYZ',(SELECT COUNT(*) as ctr FROM items
   WHERE itemcode!=''),'GZ') WHERE itemid=123;

特定のプロパティを持つレコードを選択していますitems

SELECT COUNT(*) as ctr FROM items WHERE itemcode!=''

次にitemcodeitemid123 の を XYZGZ に関連付けます。

これは、UPDATE JOINbetweenitemsとで行うこともできますctr:

UPDATE items JOIN ( 
   SELECT CONCAT('XYZ', COUNT(*), 'GZ') AS newcode FROM items
       WHERE itemcode!='') AS dummy
SET itemcode = dummy.newcode WHERE itemid = 123;

または、MySQL (および LOCK TABLES を使用) ではSELECT、カウントを一時変数に入れ、itemcodeその変数に割り当てることができます。

mysql> CREATE TABLE items ( itemid integer, itemcode varchar(32) );
mysql> INSERT INTO items VALUES ( 1, 'one' ), ( 2, 'two' ), ( 123, 'and 123');
mysql> LOCK TABLE items WRITE;
mysql> BEGIN WORK;
mysql> SELECT COUNT(*) INTO @x FROM items WHERE itemcode != '';
mysql> UPDATE items SET itemcode=CONCAT('XYZ',@x,'GZ') WHERE itemid = 123;
mysql> COMMIT WORK;
mysql> UNLOCK TABLES;


mysql> SELECT * FROM items;
+--------+----------+
| itemid | itemcode |
+--------+----------+
|      1 | one      |
|      2 | two      |
|    123 | XYZ3GZ   |
+--------+----------+
3 rows in set (0.00 sec)

明示的なロックなしで、同じことを行うより短い方法:

mysql> BEGIN WORK;
mysql> SELECT COUNT(*) INTO @x FROM items WHERE itemcode != '' FOR UPDATE;
mysql> UPDATE items SET itemcode=CONCAT('XYZ',@x,'GZ') WHERE itemid = 123;
mysql> COMMIT WORK;
于 2013-10-19T17:20:01.523 に答える
0

答えが見つかりました!

SET同じテーブルにアクセスしようとしていたため、サブクエリはパーツ内にあってはなりません。質問のクエリは次のエラーを返します。

#1093 – You can’t specify target table ‘items’ for update in FROM clause.

解決:

UPDATE items,(SELECT COUNT(*) as ctr FROM items WHERE itemcode!='') temp
        SET itemcode=CONCAT('XYZ',temp.ctr+1,'GZ') WHERE itemid=123;

ソース: http://7php.com/mysql-update-select-statement-1093/

于 2013-10-19T17:19:36.880 に答える
0

これは、この場合に使用できるクエリの例です。

UPDATE
    Table AS t
    LEFT JOIN (
        SELECT
            Index1,
            Index2,
            COUNT(EventType) AS NumEvents
        FROM
            MEvents
        WHERE
            EventType = 'A' OR EventType = 'B'
        GROUP BY
            Index1,
            Index2
    ) AS m ON
        m.Index1 = t.Index1 AND
        m.Index2 = t.Index2
SET
    t.SpecialEventCount = m.NumEvents
WHERE
    t.SpecialEventCount IS NULL

元々は @Hammerite hereによって投稿されました。

于 2013-10-19T17:15:10.140 に答える