1

私はこのようなテーブルを持っています:

entity_guid    | name           | value
---------------|----------------|--------
189501         | context        | groups
189501         | column         | 3
189509         | context        | profile
189509         | column         | 3
189521         | context        | profile
189521         | column         | 2
189551         | context        | groups
189551         | column         | 1
189552         | context        | groups
189552         | column         | 3
189554         | context        | groups
189554         | column         | 2
189559         | context        | profile
189559         | column         | 1
189591         | context        | profile
189591         | column         | 3

name = column行を更新したいvalue = 3ので、value = 2entity_guidしかし、私は別の行が存在する行を同じで、そしてname = contextで更新したいだけですvalue = groups

したがって、たとえば、変更する行を選択すると、次のようになります。

entity_guid    | name           | value
---------------|----------------|--------
189501         | column         | 3
189552         | column         | 3

私が試してみました:

SELECT * FROM (
    SELECT * FROM `elggprivate_settings` WHERE `name` = 'context' AND `value` = 'groups'
) AS subquery
WHERE `name` = 'column' AND `value` = 3

しかし、テーブルがそのように設定されていないため、もちろんそれは機能しません。同じに対して複数の行がありますentity_guid。ちなみに、これはソーシャルネットワークエンジンであるelggのデータベース内のテーブルです。私はMySQLがあまり得意ではなく、オンラインで答えを見つけることができませんでした。

4

2 に答える 2

1

xQbertは近かったが、サブレコードの存在をチェックするためのcontext/groups句を忘れていた。

UPDATE 
  elggprivate_settings
SET
   value = '2'
WHERE
   name = 'column' AND value = '3'
   AND entity_guid IN (
     SELECT 
       entity_guid 
     FROM 
       elggprivate_settings 
     WHERE 
       name = 'context'  
       AND value = 'groups')
于 2013-02-26T18:37:59.667 に答える
0

最も速い方法は、テーブルをそれ自体に結合することです(結合は通常、サブクエリよりも高速です)。

UPDATE elggprivate_settings es
 JOIN elggprivate_settings es2
   ON es2.entity_guid = es.entity_guid
SET es.value = '2'
WHERE es.value = '3'
AND es.name = 'column'
AND es2.name = 'context'
and es2.value = 'groups';
于 2013-02-26T18:37:58.127 に答える