2014-02-24 58 views
0

對不起,但我找不到最好的單詞來給此標題。 但是,這是怎麼回事:只更新具有第一行的相同值組合的列的行 - MySQL

我(例如)有此表

| 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更改爲0來更新其他具有相同數字1組合的行(所有P1 = 1且P2 = 1和P4 = 1的行)。 在此示例中,只有第三行將會更新改爲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行在這兩列上具有相同的值,使它們對更新有效。

回答

0

爲了避免更新原點l行,並知道哪一行是第一行,您需要某種行標識符(主鍵)如果有,則查詢不是也不是複雜的,您將加入您的原始查詢與表並使用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

+0

它正是我所說的! :)我會有更多的列和行,但我只需要在一個循環內完成它(我也使用C++)。發現如何使用MySQL連接器使用C++代碼,但這是另一個不錯的選擇。謝謝 :) – RubenC

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

?最好的我可以拿出你的榜樣...

+0

我很欣賞你的答案,但問題是,第一行的組合是隨機的。正如我所說的「棘手的部分是,我不知道哪列將在第一行中有任何數字,我需要獲得數字1的列,然後更新,如果有其他行的值爲1同一列「 – RubenC

+0

'select * from yourtable where p1 + p2 + p3 + p4 = 3 limit 1' to get first row,then build the second query from this result? –

+0

我編輯了主題以更好地解釋這裏發生的事情:p – RubenC

0

這可以通過使用MySQL的瓦爾:

做一個選擇,指定在MySQL變量,你想要的行和存儲;

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

同樣爲P2〜P4的

UPDATE TABLE 
SET 
P1= IF([email protected], NOT P1, P1), 
P2= IF([email protected], NOT P2, P2), 
P3= IF([email protected], NOT P3, P3), 
P4= IF([email protected], NOT P4, P4) 

因此,如果任何行特定領域(使用NOT)

爲了避免更改行X的領域它的價值觀是翻轉的值相匹配的原始行將以下內容添加到查詢的末尾:

WHERE P1 != @P1 AND P2 != @P2 AND P3 != @P3 AND P4 != @P4 
相關問題