使用WHERE x IN清理MySQL资源(1,2,3)

时间:2014-01-03 20:14:46

标签: php mysql arrays

我一直在阅读优化例程,使用数组通过一个查询在多行上执行SQL函数。我的问题专门针对PHP / MySQL。

我允许用户在我正在进行的系统中做的是创建产品,然后为所述产品创建自定义属性。此问题与删除产品时的清理过程有关,因为产品数据,要素数据和要素选项都存储在不同的表中。

到目前为止,这是我目前的清理程序:

$feature_cleanup = array();
$result = mysql_query("SELECT * FROM features WHERE feature_parent = $parent_id");
if($result && mysql_num_rows($result) > 0) {
  while($assoc = mysql_fetch_assoc($result) $feature_cleanup[] = $assoc['id'];
  @mysql_query("DELETE FROM features WHERE feature_parent = $parent_id");
  // TODO: Use $feature_cleanup to delete feature options
}

我目前的想法只是做:

$cleanup_list = implode(',', $feature_cleanup);

我可以简单地将$ cleanup_list作为IN传递,还是需要在其周围添加括号,还是必须将其进一步处理成字符串?

@mysql_query("DELETE FROM feature_options WHERE option_parent IN $cleanup_list");

或者:

@mysql_query("DELETE FROM feature_options WHERE option_parent IN ($cleanup_list)");

2 个答案:

答案 0 :(得分:3)

“我可以简单地将$ cleanup_list作为IN传递,还是需要在其周围添加括号,还是必须将其进一步处理成字符串?”

该问题的答案是你需要在parens中包装IN子句以将其描述为一个集合,包括单个值。

但是,如果您已将值存储在不同的表中,并且所有值都需要同时删除,则应通过仔细使用级联删除来处理数据库本身。例如,如果删除了产品,则应将该删除级联到特色产品等,这样就不会留下任何产品的痕迹。不希望产品被推特出售。让数据库完成工作。

答案 1 :(得分:2)

我建议您使用sub query

DELETE FROM features WHERE feature_parent IN (SELECT * FROM features WHERE feature_parent = $parent_id)

不确定我的Sub查询是否符合您的需求,但我希望您明白这一点。