我想加入两张桌子。没问题。我有完全不同的问题。
这是我的代码:
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
答案 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,所以如果以逗号分隔的字符串很长,这将会中断。