MySQL Update表由同一列中的matchig值组成

时间:2018-04-29 00:46:18

标签: mysql sql database

我有一个表格,用于存储不同组的数据,如果一列中的值匹配,我需要更新一个组。

表格如下:

prop_id | group_id | value | visible
1       | 1        | 10    | 1
1       | 2        | 10    | 1
1       | 3        | 15    | 1
2       | 1        | 10    | 1
2       | 2        | 10    | 1
2       | 3        | 10    | 1

如果visible列中的值等于0,我想将group_id=3列设置为value group_id=1。在这种情况下,如果value=10 group_id=1 and group_id=3 visible=0而不是group_id=3

设置prop_id | group_id | value | visible 1 | 1 | 10 | 1 1 | 2 | 10 | 1 1 | 3 | 15 | 1 2 | 1 | 10 | 1 2 | 2 | 10 | 1 2 | 3 | 10 | 0

更新后的预期结果

nlme

这怎么可能?

2 个答案:

答案 0 :(得分:1)

首先将其写为SELECT

从简单开始,我们知道要更新的行是group_id=3visible=1,因此请编写一个获取所有这些行的查询:

SELECT g3.value
     , g3.visible 
  FROM mytable g3
 WHERE g3.group_id = 3
   AND g3.visible  = 1 

我们知道要更新的行在该集合中,但还有一些其他条件。

所以我们延伸它。根据规范,我们需要查明是否有group_id=1行匹配visible=1(匹配value)。

我们可以使用EXISTS相关子查询来检查,或者我们可以使用JOIN

SELECT g3.group_id
     , g3.value
     , g3.visible
  FROM mytable g3
 WHERE g3.group_id = 3
   AND g3.visible  = 1
   AND EXISTS ( SELECT 1
                  FROM mytable g1
                 WHERE g1.group_id = 1
                   AND g1.visible  = 1
                   AND g1.value    = g3.value 
              )

- 或 -

SELECT g3.group_id
     , g3.value
     , g3.visible
  FROM mytable g3
  JOIN mytable g1 
    ON g1.group_id = 1
   AND g1.visible  = 1 
   AND g1.value    = g3.value
 WHERE g3.group_id = 3
   AND g3.visible  = 1

在特定条件下验证查询是否返回我们要更新的行。 (验证SELECT语句的结果并根据需要进行调整要比UPDATE语句更容易。)

一旦我们有SELECT查询工作并验证(返回我们想要更新的行),我们就可以将其转换为UPDATE语句。将SELECT ... FROM替换为UPDATE并添加一个返回行的SET子句

UPDATE mytable g3
  JOIN mytable g1 
    ON g1.group_id = 1
   AND g1.visible  = 1
   AND g1.value    = g3.value

   SET g3.visible  = 0 

 WHERE g3.group_id = 3
   AND g3.visible  = 1

答案 1 :(得分:0)

使用Self JOIN然后UPDATE

你可以试试这个。

UPDATE T t1 
JOIN T t2 on t1.group_id = t2.group_id 
and t1.rop_id<>t2.rop_id and t1.value > t2.value 
SET t2.visible = 0

sqlfiddle:http://sqlfiddle.com/#!9/6f06de/1