MySQL JOIN&拆分字符串

时间:2010-08-29 16:04:27

标签: string mysql join

我想加入两张桌子。没问题。我有完全不同的问题。

这是我的代码:

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

主要问题是table1.field是一个以逗号分隔的字符串。是否有任何好的和快速的方法来分裂它?

更新
我找到了Federico 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, '');

用法:

SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;

非常有用但它需要将位置整数作为第三个参数。无论如何,我知道以逗号分隔的单词数量。基本上,它最多20个字,但我不知道有多少。

更新2 澄清我的问题。这是我喜欢的(我知道以下查询不正确):

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

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

1 个答案:

答案 0 :(得分: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,所以如果以逗号分隔的字符串很长,这将会中断。