2012-09-07 40 views
2

我有一個壞預測的數據庫,其中有一個像「1,2,5,10」這樣的文本列的ID集。我需要獲得以相同方式設置的兩列的交集。 我不喜歡用PHP或其他腳本語言來做,我也不喜歡MySQL的自定義函數。 有沒有什麼辦法讓逗號分隔字符串給出的兩組相交?MySQL字符串設置並獲得交集

其實我不需要有完整的交集,我只需要知道兩組中是否有相同的數字。如果是的話,我需要有「1」,如果沒有相同的號碼,我需要有「0」。

謝謝。

+0

可以連接多少個值?有限制嗎? – Madhivanan

+0

@Madhivanan當然,不超過20個逗號分隔的值。 – Epsiloncool

+0

你有錯誤的數據,但不喜歡使用典型的解決方案來解決這些問題......爲什麼不呢? – eggyal

回答

3

您或許可以使用REGEXP來做一些巧妙的替換操作。

認爲這應該這樣做(免責聲明:沒有廣泛的測試吧):

SELECT col1, 
     col2, 
     CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS regex, 
     col1 REGEXP CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS intersect 
FROM tbl 

http://sqlfiddle.com/#!2/7b86f/3

爲了解釋:該功能可將col2爲正則表達式針對col1匹配。 (\,|$)位可以匹配逗號或字符串的結尾。希望這有助於...

+0

工程就像一個魅力!謝謝! – Epsiloncool

+0

非常感謝你! – mirsch

0

Steve的代碼在所有情況下都不起作用。 對於e.x,當在另一個號碼中可以找到數字時它不起作用。 INSERT INTO tbl(col1,col2) VALUES('60,61,64,68,73','14,16,17,18,1'); 稍微調整它可以工作:

SELECT col1, 
col2, 
CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS regex, 
CONCAT(',',col1,',') REGEXP CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS intersect 
FROM tbl