2

status_t という名前のテーブルがあります。

**id** **page** **status** **locked**_by
  1      0        2          0
  1      1        2          0
  1      2        2          0
  2      0        0          0
  2      1        2          0
  2      2        2          0

主キーは (id, page) です。

上記の例では、すべてのページのステータスが 2であるすべての行を更新したいと考えています。

つまり、クエリは id = 1 のすべての行をステータス 3 に更新する必要があります。したがって、テーブルは次のようになります。

**id** **page** **status** **locked**_by
  1      0        3          1
  1      1        3          1
  1      2        3          1
  2      0        0          0
  2      1        2          0
  2      2        2          0

私が試してみました:

SELECT * FROM  status_t AS t
 WHERE id IN   
 (SELECT id FROM status WHERE status = 0) LIMIT 10

上記のクエリは更新する行をフェッチしますが、それはできません:

UPDATE status_t as S1 WHERE id IN 
(SELECT id FROM status_t WHERE status = 2) 
SET S1.status = 3, S1.locked_by = 1

編集:

上記の表は一例です。

WHERE id = 1 を更新したくありません。同じIDのステータス= 2のIDに関係なく、行を更新したいだけです。上記の例で、キー (2, 2) を持つ行のステータスが 2 の場合、それを更新する必要があります。

4

6 に答える 6

1

これを試して:

UPDATE status_t a 
INNER JOIN (SELECT id FROM status_t WHERE STATUS = 2 GROUP BY id HAVING COUNT(*) = 3 LIMIT 1) AS b ON a.id = b.id
SET a.status = 3, a.locked_by = 1;

これにより、すべてのページのステータスが 2 の場合に必要に応じてデータが更新されます。

于 2012-11-29T11:02:25.183 に答える
1

これはうまくいくはずです:

update status_t t
join (
    select distinct id from status_t s
    where status=2 and not exists (
        select 1 from status_t ss
        where s.id=ss.id and s.status <> ss.status
    )
) i on i.id = t.id
set t.status = 3

status内部クエリは、 のすべての値がに設定されているID を選択し2ます。これは、ID が同じでステータスが異なる行がないことを確認することで、この結果を達成します。

これはsqlfiddleのデモです。

于 2012-11-29T11:05:02.513 に答える
0

次のようにしてください。

UPDATE status_t 
SET status = 3, locked_by = 1 
WHERE status = 2

WHERE は UPDATE ステートメントで直接使用できるため、サブクエリを使用する必要はありません。

編集:

の行に対してのみ更新が行われたことに気付きましたID = 1。これは、「上記の例では、すべてのページのステータス = 2 であるすべての行を更新したいと考えています。id . The rows where= 2 status = 2」というステートメントにも一致しません。, and私のクエリによって更新されます。

特定の ID のみを更新する必要がある場合は、クエリの最後に次を追加します。

AND id = 1

于 2012-11-29T10:49:33.390 に答える
0

これを試して::

UPDATE status_t SET status = 3, locked_by = 1 WHERE status = 2

そして、あなたのやり方でこれを達成したい場合:

UPDATE 
status_t as S1 
INNER JOIN 
(
   SELECT keyword_id 
    FROM status_t WHERE status = 2
 ) as tempStatus ON id= tempStatus.keyword_id

SET S1.status = 3, S1.locked_by = 1
于 2012-11-29T10:50:28.830 に答える
0

これを試して

  update status_t set staus=3 ,locked_by=1 
  where id=1

また

 update status_t set status=3 ,locked_by=1 
  where status=2
于 2012-11-29T10:50:56.090 に答える
0
UPDATE status_t SET status = 3, S1.locked_by = 1 WHERE id = 1
于 2012-11-29T10:52:56.057 に答える