如何按||分隔符拆分MySQL查询结果列?含PHP实现报错求助
MySQL 实现方案
你现在的查询已经把DESCRIPTION按::拆分成了单独的行,接下来只需要对每一行的内容再按||拆分就能得到你想要的两列啦。可以嵌套使用SUBSTRING_INDEX来实现:
SELECT sample.id, -- 先拆分出单个的detail+response组合 SUBSTRING_INDEX(SUBSTRING_INDEX(sample.DESCRIPTION, '::', numbers.n), '::', -1) AS full_item, -- 拆分出||左边的DETAIL SUBSTRING_INDEX(full_item, '||', 1) AS DETAIL, -- 拆分出||右边的RESPONSE SUBSTRING_INDEX(full_item, '||', -1) AS RESPONSE FROM numbers INNER JOIN sample ON CHAR_LENGTH(sample.DESCRIPTION) - CHAR_LENGTH(REPLACE(sample.DESCRIPTION, '::', '')) >= numbers.n - 1 ORDER BY id, n
执行这条语句后,就能得到你期望的id、DETAIL、RESPONSE三列结果了。
PHP 代码错误修复
你遇到的undefined offset错误主要有几个原因:
fetchObject()只获取了第一条记录,会漏掉其他sample数据- 没有判断拆分后的数组索引是否存在,比如某个拆分项里没有
||分隔符时,直接取索引1就会报错 - 存在未初始化或冗余的变量(比如
$rowCount、$counter1这些没用到的变量)
这里给你修改后的代码,解决这些问题:
$querydata = "SELECT id, DESCRIPTION from sample"; $resultdata = $conn->prepare($querydata); $resultdata->execute(); // 循环遍历所有sample记录 while ($storeresult = $resultdata->fetchObject()) { $resultquery = $storeresult->DESCRIPTION; $pieces = explode("::", $resultquery); // 遍历每个拆分出来的item foreach ($pieces as $piece) { // 用limit=2确保最多拆成两部分,避免多个||的情况 $parts = explode("||", $piece, 2); // 安全获取值,避免索引不存在报错 $detail = isset($parts[0]) ? $parts[0] : ''; $response = isset($parts[1]) ? $parts[1] : ''; // 输出结果,也可以根据需求存入数组或数据库 echo "ID: {$storeresult->id}<br>"; echo "Detail: {$detail}<br>"; echo "Response: {$response}<br><br>"; } }
这样处理后,既能遍历所有数据,也不会出现索引不存在的错误了。
内容的提问来源于stack exchange,提问作者Rukikun
相关产品推荐
相关产品推荐

