2012-07-03 22 views
2

我有一個包含兩列(id和word)的表。我有一個其他表有一個數據列和它的值引用第一個表中的單詞。這裏是一個示例代碼:替換值中的列引用

CREATE TABLE `words` (
    `id` TINYINT, 
    `word` VARCHAR(50), 
    PRIMARY KEY (`id`) 
); 

INSERT INTO `words` VALUES (1, 'one'), (2, 'two'), (3, 'three'); 

CREATE TABLE `data` (
    `data` TEXT 
); 

INSERT INTO `data` VALUES ('foo=bar\nword=one'), ('word=three'); 

我想用單詞的引用替換爲ID。因此word=one將變爲word=1word=three將變爲word=3等等。我試過這個查詢,但它不起作用:

UPDATE `data`, `words` SET `data`.`data` = REPLACE(`data`.`data`, CONCAT('word=', `words`.`word`), CONCAT('word=', `words`.`id`)); 

任何建議或想法如何實現我想要的?謝謝!

編輯:忘了提及數據列是INI格式,所以其他鍵值對也可以在字段中。調整了示例。

編輯:感謝@nortphole的想法,我設法建立我需要的查詢:

UPDATE `data` SET `data`.`data` = REPLACE(`data`.`data`, CONCAT('word=', SUBSTRING_INDEX(SUBSTRING_INDEX(`data`.`data`, 'word=', -1), '\n', 1)), CONCAT('word=', (SELECT `id` FROM `words` WHERE `words`.`word` = SUBSTRING_INDEX(SUBSTRING_INDEX(`data`.`data`, 'word=', -1), '\n', 1)))); 
+0

這不是很好的設計,你不應該把這些字段組合在一列上。實際上,「word = one」或「word = 1」沒有實際區別。你想這樣做動態SQL? 「 – Lamak

+0

」但它不起作用「具體發生了什麼?你有錯誤信息嗎?任何行都可以修改嗎? –

+0

@MarkByers不,我沒有收到錯誤消息。在這個例子中,'word = one'被替換爲'word = 1',但'word = three'不是。 –

回答

2

嘗試是這樣的:

UPDATE data 
    SET data = CONCAT('word=',(SELECT id 
           FROM words 
           WHERE words.word = SUBSTRING_INDEX(data.data,'=',-1))) 

對不起,我並未對MySQL在這裏進行測試(特別確保SUBSTRING在'word ='之後獲取所有內容)

編輯: 我使用substring_index和-1來得到最後一個= 標誌。

+0

這適用於示例數據。問題是數據列是INI格式,所以'foo = bar \ nword = one'(其中\ n是一個新的行字符)也可以是一個值。在這種情況下,您的解決方案不起作用。看起來我讓這個例子太簡單了,對不起。 –

+0

@GergoErdosi - 不用擔心,但爲什麼你不用當前問題中的實際數據更新你的問題,所以我(和其他人)可以解決實際問題。 – northpole

+0

更新了問題。 –