MySQL存储逗号分隔值时如何拆分搜索结果且不修改库内存储结构
解决方案
你可以选择以下任意一种方案实现需求,全程不需要修改数据库原有存储格式:
方案1:应用层拆分(推荐,改造成本最低)
你无需调整现有MySQL查询逻辑,只需要在拿到查询结果后加一层数据处理即可,以PHP为例,示例代码如下:
// $searchResults 为你原有LIKE查询得到的结果集 foreach ($searchResults as $row) { // 按逗号拆分Name字段得到单个名字数组 $nameList = explode(',', $row['Name']); // 每个名字对应输出原行的Title foreach ($nameList as $singleName) { echo "<h2><code>{$singleName}</code></h2>"; echo "<p><code>{$row['Title']}</code></p>"; } }
其他开发语言逻辑完全一致,只需要调用对应语言的字符串分割方法处理Name字段即可。
方案2:MySQL查询层面直接拆分
如果不想修改业务层代码,可以直接用递归CTE在查询时把逗号分隔的Name拆分为多行返回,示例查询语句如下(假设你的表名为goods_table,搜索关键词为Abu):
WITH RECURSIVE split_result AS ( SELECT TRIM(SUBSTRING_INDEX(Name, ',', 1)) AS single_name, TRIM(SUBSTRING(Name, LENGTH(SUBSTRING_INDEX(Name, ',', 1)) + 2)) AS left_name, Title FROM goods_table WHERE Name LIKE '%Abu%' OR Title LIKE '%Abu%' UNION ALL SELECT TRIM(SUBSTRING_INDEX(left_name, ',', 1)) AS single_name, TRIM(SUBSTRING(left_name, LENGTH(SUBSTRING_INDEX(left_name, ',', 1)) + 2)) AS left_name, Title FROM split_result WHERE left_name != '' ) SELECT single_name, Title FROM split_result;
执行上述语句得到的结果集本身就是每个名字单独一行,直接按格式输出即可。
补充说明:现有
%$keyword%的模糊查询逻辑在数据量超过10万条时会出现明显性能下降,后续数据量变大后可以考虑添加全文索引优化查询速度。
内容的提问来源于stack exchange,提问作者nur atiqa
相关产品推荐
相关产品推荐

