2013-04-09 47 views
0

我正在想嘗試和運行一個查詢將更新我的表ptb_messages和周圍轉兩列的數據,比如我的繼承人表:在mysql中切換列數據?

id | to_user_id | from_user_id | 

1   4    5 
2   5    6 
3   7    9 

所以我想嘗試做的是切換從from_user_id到to_user_id的值,反之亦然。

我打算用這之前,我意識到,一旦我從一個表中複製值到另一個從另一列的原始數據便被改寫,

$sql = mysql_query("UPDATE ptb_messages SET ptb_messages.from_user_id=ptb_messages.to_user_id"); 

我真正需要的是一種交換功能,

IM真的不知道我怎麼可能,但即時通訊做到這一點想象它是這樣的:

$sql = mysql_query("UPDATE ptb_messages SET to_user_id=from_user_id, from_user_id=to_user_id"); 

希望有人能幫助我請。

+0

[**請不要在新的代碼中使用'mysql_ *'功能**](HTTP: //bit.ly/phpmsql)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。 – Kermit 2013-04-09 02:08:26

+0

您確定要使用PHP嗎? – hjpotter92 2013-04-09 02:09:45

+1

看看這個 - > http://stackoverflow.com/questions/37649/swapping-column-values-in-mysql – xQbert 2013-04-09 02:11:50

回答

2

那麼,mysql有一個概念叫user variable。你可以利用這個存儲的值,並將其設置爲上交換柱,

UPDATE Table1 
SET to_user_id = from_user_id, 
     from_user_id = @r1 
WHERE @r1 := to_user_id 

在這裏看到:http://www.sqlfiddle.com/#!2/8cd6a/1

怎麼樣用自己加盟表?

UPDATE Table1 a 
     INNER JOIN Table1 b 
      ON a.to_user_id = b.to_user_id AND 
       a.from_user_id = b.from_user_id 
SET  a.to_user_id = b.from_user_id, 
     a.from_user_id = b.to_user_id 

在這裏看到:http://www.sqlfiddle.com/#!2/d6b4f/1

+0

,但仍然給我同樣的問題,但它更新from_user_id並將其複製到to_user_id但to_user_id沒有被複制到from_user_id:/ – 2013-04-09 02:29:54

+0

如果我沒有弄錯,你絕對不能保證to_user_id會在from_user_id之前被更新。 – 2013-04-09 02:31:04

+0

我無法理解。它似乎在小提琴右側工作? – 2013-04-09 02:31:11

1

我要拋出一個答案在那裏,雖然我覺得瘦管道的答案是多了幾分優雅。 。

您可以創建臨時表的值存儲在

http://www.sqlfiddle.com/#!2/3631d/1

create table ptb_messages_temp (
    id int, 
    tempid int); 

insert into ptb_messages_temp (id, tempid) (select id, to_user_id from ptb_messages); 

-- DO THE UPDATE 
UPDATE ptb_messages 
LEFT OUTER JOIN ptb_messages_temp on ptb_messages.id=ptb_messages_temp.id 
SET 
ptb_messages.to_user_id=ptb_messages.from_user_id, 
ptb_messages.from_user_id=ptb_messages_temp.tempid;