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

如何筛选products表中含指定活跃item且所有item均活跃的记录?

解决方案:过滤含非活跃item的Products记录

核心逻辑

要实现需求,需同时满足两个条件:

  • Products记录包含指定item(如table)
  • Products的item1、item2、item3对应的所有item在items表中均为活跃状态(active='S')

通过关联items表进行多表查询,直接在SQL层面完成过滤,效率远高于查询后再用PHP二次过滤。

修正后的SQL与PHP代码

使用预处理语句避免SQL注入风险,同时通过三次INNER JOIN确保所有item均为活跃:

<?php
$targetItem = "table";
// 若需要模糊匹配(如包含table的任意值),可改为 $targetItem = "%table%";

// 构建预处理SQL语句
$sql = "SELECT p.* 
        FROM products p
        INNER JOIN items i1 ON p.item1 = i1.item AND i1.active = 'S'
        INNER JOIN items i2 ON p.item2 = i2.item AND i2.active = 'S'
        INNER JOIN items i3 ON p.item3 = i3.item AND i3.active = 'S'
        WHERE p.item1 LIKE ? OR p.item2 LIKE ? OR p.item3 LIKE ?
        LIMIT 10";

// 初始化预处理语句
$stmt = mysqli_prepare($conn, $sql);
// 绑定三个字符串参数(对应三个LIKE条件)
mysqli_stmt_bind_param($stmt, "sss", $targetItem, $targetItem, $targetItem);
// 执行查询
mysqli_stmt_execute($stmt);
// 获取结果集
$result = mysqli_stmt_get_result($stmt);

// 遍历输出结果
while($row = mysqli_fetch_assoc($result)) {
    echo "{$row['id']} - {$row['item1']}, {$row['item2']}, {$row['item3']}<br>";
}

// 清理资源
mysqli_stmt_close($stmt);
?>

关键说明

  1. 多表关联过滤:通过INNER JOIN将products的每个item字段与items表关联,仅保留所有item均为活跃的products记录。
  2. SQL注入防护:使用预处理语句替代直接字符串拼接,彻底避免恶意输入导致的安全问题。
  3. 模糊匹配调整:如果需要匹配包含指定item的记录(而非完全相等),只需将$targetItem赋值为"%table%"即可,预处理逻辑无需修改。

内容的提问来源于stack exchange,提问作者Lander de Oliveira Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:42:39