substring_index 模仿 split 问题

米斯特程序猿 2021年01月12日 425次浏览

开发场景如下

  • 项目中使用了如下格式保存了服务站与团点之间的关系
service_idrival_ids
1231,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 要处理数据的量