2012-03-05 13 views
0

グループに現在のトランザクションを配置する1つのSQL構文を書きたいと思います。この取引は、最後の60秒以内に行われなければならなかった。 現在のトランザクションを他の既存のトランザクションとグループ化するには、直前に実行された他のトランザクションからコピーされたグループID番号(GRID)を割り当てます。サブクエリ条件付きでmysqlデータベースを更新する

購入したSQLスクリプトは、直前に完了した他の購入を探して見つけた場合、見つかった行からグループ番号を取得して現在の購入に割り当てます。この場合、購入ごとに1分以内に行われると、グループで自分自身を見つけるでしょう。

これは、しかし、これは常に存在する行が1が更新されることになっている、またはした他の行のみの場合でも、更新された行の数を返しI以下の更新ステートメントが

UPDATE TRANSACTIONS 
SET GRID=(SELECT G FROM 
     (SELECT GRID AS G 
      FROM TRANSACTIONS 
      WHERE CUST_ID='123ID' 
      AND STAMP+60>UNIX_TIMESTAMP() 
      LIMIT 1) 
     AS t), 
STAMP=UNIX_TIMESTAMP() 
WHERE CUST_ID='123ID' 
AND STAMP+60>UNIX_TIMESTAMP(); 

を構成しているあります見つかったグループ番号はまだ割り当てられていません。これはサブクエリで見つかった値で更新されるので明らかです。何も見つからない場合、空の値で更新されます。 私が興味を持って2つの解決策があります。

  1. 私は(サブクエリから)見つかった場合は、このスクリプトは、値は基本的に空である(条件によって)アップデートの実行を停止します。 または
  2. サブクエリが空の値を返した場合、代わりに文字の修正文字列が挿入されるという条件を挿入します。

答えて

0

私の問題を探っているうちに、私は解決に至りました。 以下のMySQL構文が私の望むものです。

非常に興味深いMySQL関数IFNULL()に注意してください。非常に便利なことができます!

UPDATE TRANSACTIONS 
SET GRID=(SELECT G FROM 
     (SELECT IFNULL(GRID, 'NO ID') AS G 
     FROM TRANSACTIONS 
     WHERE CUST_ID='123ID' 
     AND STAMP+60>UNIX_TIMESTAMP() 
     LIMIT 1) 
    AS t), 
STAMP=UNIX_TIMESTAMP() 
WHERE CUST_ID='123ID' 
AND STAMP+60>UNIX_TIMESTAMP();