仅更新具有第一行相同值组合的列的行--MySQL

时间:2014-02-24 17:12:10

标签: mysql combinations rows

我很抱歉,但我找不到最好的词来给这个标题。 但这是正在发生的事情:

我(例如)有这个表

|   P1   |   P2   |   P3   |   P4   |
|    1   |    1   |    0   |    1   |
|    0   |    1   |    0   |    0   |
|    1   |    1   |    1   |    1   |
|    0   |    0   |    1   |    1   |

我写了

SELECT * FROM Table WHERE P1!=0 OR P2!=0 OR P3!=0 OR P4!=0 LIMIT 1;

它将返回给我第一行,现在我想更新到具有相同组合的数字1(所有行,P1 = 1,P2 = 1和P4 = 1)的其他行他们的数字从1到0。 在此示例中,仅第3行将更改为0010。

棘手的部分是,我不知道哪些列将包含第一行中的任何数字(第一个组合是随机的)。我需要获取数字为1的列,然后更新是否在同一列中有其他值为1的行。

这有点乱,但我希望你理解它。

在此示例中,最终表格为:

|   P1   |   P2   |   P3   |   P4   |
|    1   |    1   |    0   |    1   |
|    0   |    1   |    0   |    0   |
|    0   |    0   |    1   |    0   |
|    0   |    0   |    1   |    1   |

澄清:

另一组随机组合到达我的表:

表2是:

|   P1   |   P2   |   P3   |   P4   |
|    0   |    1   |    0   |    1   |
|    1   |    1   |    0   |    1   |
|    1   |    0   |    1   |    0   |
|    0   |    1   |    1   |    1   |

随着更新,它将返回:

|   P1   |   P2   |   P3   |   P4   |
|    0   |    1   |    0   |    1   |
|    1   |    0   |    0   |    0   |
|    1   |    0   |    1   |    0   |
|    0   |    0   |    1   |    0   |

P2和P4在第一行中= 1,因此第2行和第4行在这2列上具有相同的值,使它们对更新有效。

3 个答案:

答案 0 :(得分:0)

UPDATE yourtable
SET p1=1, p2=1, p3=0, p4=0
WHERE p1=1 and p2=1 and p4=1

?鉴于你的榜样,我能想出最好的......

答案 1 :(得分:0)

这可以通过利用MySQL变量来实现:

选择指定所需的行并存储在MySQL变量中;

@P1 = SELECT P1 FROM TABLE WHERE ....

P2到P4相同

UPDATE TABLE
SET 
P1= IF(P1=@P1, NOT P1, P1),
P2= IF(P2=@P2, NOT P2, P2),
P3= IF(P3=@P3, NOT P3, P3),
P4= IF(P4=@P4, NOT P4, P4)

因此,如果任何行中的给定字段与行X字段的值匹配,则会翻转其值(使用NOT)

为避免更改原始行,请在查询末尾添加以下内容:

WHERE P1 != @P1 AND P2 != @P2 AND P3 != @P3 AND P4 != @P4 

答案 2 :(得分:0)

为避免更新原始行并知道哪一行是第一行,您需要某种行标识符(主键)如果您有一行,则查询不是 复杂,您将使用表格加入原始查询,并使用IF(或CASE)查找和更新匹配项;

UPDATE tablea a1
JOIN (
  SELECT * FROM TableA WHERE P1!=0 OR P2!=0 OR P3!=0 OR P4!=0 ORDER BY id LIMIT 1
) a2
ON IF(a2.p1, a1.p1, 1) AND IF(a2.p2, a1.p2, 1) AND 
   IF(a2.p3, a1.p3, 1) AND IF(a2.p4, a1.p4, 1) AND a1.id<>a2.id
SET a1.p1=IF(a2.p1, 0, a1.p1), a1.p2=IF(a2.p2, 0, a1.p2),
    a1.p3=IF(a2.p3, 0, a1.p3), a1.p4=IF(a2.p4, 0, a1.p4);

An SQLfiddle to test with