如何筛选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); ?>
关键说明
- 多表关联过滤:通过
INNER JOIN将products的每个item字段与items表关联,仅保留所有item均为活跃的products记录。 - SQL注入防护:使用预处理语句替代直接字符串拼接,彻底避免恶意输入导致的安全问题。
- 模糊匹配调整:如果需要匹配包含指定item的记录(而非完全相等),只需将
$targetItem赋值为"%table%"即可,预处理逻辑无需修改。
内容的提问来源于stack exchange,提问作者Lander de Oliveira Santos
相关产品推荐
相关产品推荐

