6

SQLを学習しています。これが初歩的なものである場合は、申し訳ありません。UPDATE次の疑似コードの実用的な解決策を見つけようとしています。

UPDATE tableA 
SET tableA.col1 = '$var'
WHERE tableA.user_id = tableB.id
AND tableB.username = '$varName'
ORDER BY tableA.datetime DESC LIMIT 1

上記はSELECT構文に似ていますが、基本的にはtableAの最新行の単一の列値を更新しようとしています。tableB.username($ varNameで表される)で見つかったユーザー名は、tableB.idのID番号にリンクされています。 tableA.user_idのIDとして存在します。

うまくいけば、それは理にかなっています。なんらかのJOIN必要があると思いますが、サブクエリは面倒そうですUPDATE。複数のテーブルがUPDATEに関係している場合、私は理解ORDER BYしてLIMITおり、立ち入り禁止です...しかし、機能が必要です。これを回避する方法はありますか?

少し混乱しました、よろしくお願いします。

4

2 に答える 2

17

解決策は、結合の一部としてFROM句にORDERBYとLIMITをネストすることです。これにより、最初に更新する正確な行(ta.id)を見つけてから、更新をコミットできます。

UPDATE tableA AS target
    INNER JOIN (
      SELECT ta.id
      FROM tableA AS ta
        INNER JOIN tableB AS tb ON tb.id = ta.user_id
        WHERE tb.username = '$varName'
        ORDER BY ta.datetime DESC
        LIMIT 1) AS source ON source.id = target.id
    SET col1 = '$var';

この正確なトピックに関する優れた投稿については、バロンシュワルツ(別名Xaprb)への帽子のヒント: http ://www.xaprb.com/blog/2006/08/10/how-to-use-order-by-and-limit- on-multi-table-updates-in-mysql /

于 2012-05-11T14:58:47.123 に答える
0

次のクエリ構文を使用できます。

update work_to_do as target
   inner join (
      select w. client, work_unit
      from work_to_do as w
         inner join eligible_client as e on e.client = w.client
      where processor = 0
      order by priority desc
      limit 10
   ) as source on source.client = target.client
      and source.work_unit = target.work_unit
   set processor = @process_id;

これは完全に機能します。

于 2017-08-29T16:49:20.413 に答える