开发场景如下
- 项目中使用了如下格式保存了服务站与团点之间的关系
service_id | rival_ids |
---|---|
123 | 1,2,3,4,5 |
- 处理SQL如下
SELECT
request_lat,
request_lng
FROM
leaf_store
WHERE
storeId IN (
SELECT
substring_index(
substring_index(
t1.rival_ids,
',',
t2.help_topic_id + 1
),
',' ,- 1
) id
FROM
rival_group t1
JOIN mysql.help_topic t2 ON t2.help_topic_id < (
length(t1.rival_ids) - length(
REPLACE (t1.rival_ids, ',', '')
) + 1
)
WHERE
service_id IN (123)
)
这个SQL本身没什么语法问题,可以正常执行,也能获取到结果,在开发测试时候也没发现什么问题,但是真实把所有数据计算完后问题就来了,现象就是拿到的数据最多只有637条
上面这个问题主要出现在 help_topic 这个辅助表上,因为这个表的自增ID最大是637,就造成了最终递归 substring_index 最大只能获取637个数据。
所以在使用 substring_index 模拟 split 时需要注意引用的表的自增ID必须要确保能支持存储 substring_index 要处理数据的量