2011-09-22 45 views
0

我有表以下数据 (此处键字段包括site__marker的)更新使用来自另一表匹配的ID

id  userid    key    value 
    1  1    site_1_name   http://example1.com 
    2  1    site_1_user   user1 
    3  1    site_2_name   http://example2.com 
    4  2    site_1_name   http://example3.com 
    5  2    site_1_user   user2 

和我的网站映射表

oldsiteid  newsiteid 
    1    120 
    2    152 

现在场的一部分我需要更新第一个表,只更新关键字段 中的值应该与第二个表中的oldsiteid匹配,并且应该由newsiteid更新

输出应该像

id  userid    key    value 
    1  1    site_120_name   http://example1.com 
    2  1    site_120_user   user1 
    3  1    site_152_name   http://example2.com 
    4  2    site_120_name   http://example3.com 
    5  2    site_120_user   user2 

如何做到这一点?

+0

是刻在石头上这些表的结构,也可以加以改变?如果映射表没有以任何其他方式使用,我会将数据更改为精确地指向您的键“字段”(又名_site_1_name_等)的值,这会使其变得非常简单。否则,要解决这个问题相当痛苦。 – Bjoern

+1

您的第一张表格不是[第一范式](http://en.wikipedia.org/wiki/First_normal_form),因为行列'key'不是标量值,因此您的数据不是关系数据,因此它不适合使用SQL进行更新。首先修复设计。 – onedaywhen

回答

0

你将不得不把这种REXX中SQL的功能staight前锋:

old = 'user_1_ddd' 
n = "333" 
new = substr(a,1,index(a,"_")) || n || substr(a,index(a,"_") + index(substr(a, index(a,"_")+1) ,"_")) 

结果user_333_ddd

SUBSTR在两个

索引一样,使用FIND_IN_SET

||使用CONCAT

0

我没有MySQL,但应该工作:

UPDATE TargetTable 
SET key = CONCAT 
    ( 
     SUBSTRING_INDEX(key,'_',1) 
     ,'_' 
     , (SELECT newsiteid FROM MappingTable WHERE MappingTable.oldsiteid = SUBSTRING_INDEX(SUBSTRING_INDEX(TargetTable.key,'_',-2), '_', 1)) 
     ,'_' 
     ,SUBSTRING_INDEX(key,'_',-1) 
    ) 
相关问题