2010-08-29 87 views
3

我想加入兩個表。這沒有問題。我遇到了完全不同的問題。MySQL JOIN&拆分字符串

這裏是我的代碼:

SELECT * FROM `table1` 
JOIN `table2` ON `table1.`field`=`table2`.`field` 
... 

的主要問題是,table1.field是一個字符串,以逗號分隔。有沒有什麼好的和快速的方法來分裂它?

更新
我由費德里科Cagnelutti發現功能

CREATE FUNCTION SPLIT_STR(
    x VARCHAR(255), 
    delim VARCHAR(12), 
    pos INT 
) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), 
     LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), 
     delim, ''); 

用法:

​​

非常有用,但它需要位置整數作爲第三個參數。無論如何,我不知道知道逗號分隔的詞的量。基本上,它可以達到20個字,但我不知道有多少。

更新2 澄清我的問題。下面是我喜歡(我知道下面的查詢是不正確的):

SELECT * FROM `table1` 
JOIN `table2` ON `table2`.`id` IN (`table1`.`field`) 

更新3
例字符串:table1.field = '202,185,505',table2.field = 202

+0

你能舉一個你提到的字符串的例子嗎? – zevra0 2010-08-30 01:11:39

+0

當然,編輯我的問題。 – Tom 2010-08-30 11:13:07

回答

1

我我不確定我是否明白你需要什麼,但也許你可以使用FIND_IN_SET函數?

SELECT * FROM `table1` 
JOIN `table2` ON FIND_IN_SET(`table2`.`field`, `table1.`field`) > 0 

雖然性能可能會有問題。

更新:

如果你已經領先於數據空間,給出樣品中,這可能是與REPLACE處理。在嵌入空間的情況下,這不起作用,但是可以滿足有時候有空格但有時不空格的情況。例如:

SELECT * 
FROM table1 t1 
JOIN table2 t2 
ON  FIND_IN_SET(t2.field, REPLACE(t1.field, ' ', '')) > 0 

有一個limit of 64 members in a set,所以如果逗號分隔的字符串很長,這將會中斷。

+0

我之前試過,它只返回第一個'table2.field'值。我的問題需要澄清嗎? – Tom 2010-08-29 16:20:32

+0

目前我用REGEXP解決了這個問題,想知道這是不是一個好主意。你怎麼看? – Tom 2010-08-31 14:18:29

+0

@Tom - 如果REGEXP有效,它就可以工作!注意不要錯誤匹配,例如'%85%'會意外地與您問題中的樣本數據匹配。 – 2010-08-31 21:00:03