MySQL连接和字符串分割

3
我希望将两个表连接起来。这方面没有问题。我遇到的问题是完全不同的。
以下是我的代码:
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


你能举个你所提到的字符串的例子吗? - zevra0
1个回答

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

一个集合中最多只能有64个成员,所以如果逗号分隔的字符串很长,它就会崩溃。


我之前尝试过,它只返回了第一个 table2.field 的值。我的问题需要进一步澄清吗? - Tom
目前我用正则表达式解决了这个问题,不知道这是否是一个好主意。你觉得呢? - Tom
@Tom - 如果正则表达式起作用,那就没问题了!但要注意不要出现误匹配,例如'%85%'会意外地匹配你问题中的示例数据。 - martin clayton
是的,它完美地工作了!我在20k条记录上进行了检查,没有发现任何错误。而且速度非常快。在MySQL论坛上,有人建议我规范化我的数据,并且不要将类别存储为逗号分隔的值。但是...从另一方面来看,这会导致更多的查询,这就是为什么我决定走这条路的原因。无论如何,谢谢!你的答案让我找到了REGEXP的解决方案,所以我会将其标记为正确答案(在寻找使用FIND_IN_SET的解决方案时,我找到了REGEXP)。感谢你的时间和建议。汤姆。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接