You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:40:24