2010-08-29 73 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