作者:挡不住的向左寻找爱 | 来源:互联网 | 2023-09-18 02:52
按网上现成的帖子写了一个MySQL函数split_str,用于从逗号分隔字符串取出特定位置的子串,具体为:
1 2 3 4 5 6 7 8
| 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, ''); |
然后想使用此函数取出A表中逗号分隔的ID列表中特定位置的ID并与B表连接:
1
| select A.* from A left join B on split_str(A.id_list,',',2) = B.id where ... |
explain了一下,发现没有用到B的主键ID的索引
但是如果直接把函数打开:
1 2 3
| select A.* from A left join B on
REPLACE(SUBSTRING(SUBSTRING_INDEX(A.id_list, ',', 2), LENGTH(SUBSTRING_INDEX(A.id_list, ',', 2 - 1)) + 1), ',', '') = B.id
where ... |
这样却是可以用到B的主键索引的,求MySQL大牛解惑。