如何用PDO解析PRO_LinkedProd字段查询指定商品的关联产品
查询指定产品关联信息的PDO实现方案
表结构信息
表 ___Products
|--------|----------|----------------| | PRO_Id | PRO_Name | PRO_LinkedProd | |--------|----------|----------------| | 1 | Banana | 2,3,4 | | 2 | Apple | 1,3 | | 3 | Pear | 3 | | 4 | Cherry | 1,2,3 | |--------|----------|----------------|
需求
针对单个产品(例如香蕉),解析其PRO_LinkedProd字段中的逗号分隔ID,查询出对应的关联产品信息,期望输出:
|--------|----------| | PRO_Id | PRO_Name | |--------|----------| | 2 | Apple | | 3 | Pear | | 4 | Cherry | |--------|----------|
错误尝试的SQL
你之前写的SQL存在表别名重复、逻辑匹配不准确的问题,无法得到正确结果:
SELECT *, IFNULL(GROUP_CONCAT(PRO_LinkedProd), ",") as list_prods FROM ___Products p INNER JOIN ___Products p ON p.PRO_LinkedProd like concat("%", p.PRO_Id, "%") GROUP BY PRO_Id ORDER BY PRO_Id ASC
正确实现方法
1. 修正SQL逻辑
直接用LIKE匹配逗号分隔的ID会出现误判(比如ID 12会被匹配到ID 1),改用FIND_IN_SET函数可以精准匹配列表中的ID。针对香蕉(PRO_Id=1)的正确SQL如下:
SELECT p.PRO_Id, p.PRO_Name FROM ___Products p WHERE FIND_IN_SET(p.PRO_Id, (SELECT PRO_LinkedProd FROM ___Products WHERE PRO_Id = :prodId))
如果用产品名称查询,SQL为:
SELECT p.PRO_Id, p.PRO_Name FROM ___Products p WHERE FIND_IN_SET(p.PRO_Id, (SELECT PRO_LinkedProd FROM ___Products WHERE PRO_Name = :prodName))
2. PDO完整代码实现
<?php // 数据库连接参数 $dsn = 'mysql:host=你的主机地址;dbname=你的数据库名;charset=utf8mb4'; $dbUser = '数据库用户名'; $dbPass = '数据库密码'; try { // 初始化PDO连接,开启异常模式 $pdo = new PDO($dsn, $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 目标产品ID(这里以香蕉的ID=1为例) $targetProdId = 1; // 预编译SQL语句 $sql = " SELECT p.PRO_Id, p.PRO_Name FROM ___Products p WHERE FIND_IN_SET(p.PRO_Id, (SELECT PRO_LinkedProd FROM ___Products WHERE PRO_Id = :prodId)) "; $stmt = $pdo->prepare($sql); // 绑定参数并执行查询 $stmt->bindParam(':prodId', $targetProdId, PDO::PARAM_INT); $stmt->execute(); // 获取关联产品列表 $linkedProds = $stmt->fetchAll(PDO::FETCH_ASSOC); // 格式化输出结果(可根据需求调整) echo "<table border='1'> <tr> <th>PRO_Id</th> <th>PRO_Name</th> </tr>"; foreach ($linkedProds as $prod) { echo "<tr> <td>{$prod['PRO_Id']}</td> <td>{$prod['PRO_Name']}</td> </tr>"; } echo "</table>"; } catch (PDOException $e) { die("操作失败: " . $e->getMessage()); } ?>
关键注意点
FIND_IN_SET是MySQL专门处理逗号分隔字符串的函数,能避免LIKE的部分匹配错误- 使用参数绑定(
:prodId)可以防止SQL注入,提升代码安全性 - 如果产品名称可能重复,优先用PRO_Id作为查询条件,保证结果唯一性
内容的提问来源于stack exchange,提问作者miami
相关产品推荐
相关产品推荐

