1

我有一个接受逗号分隔的标签列表的 HTML 表单,它的工作方式与 stackoverflow 上的一样。我还有一个 MySQL 表,其中包含属于每个用户的标签列表。用户可以在他们的个人资料中更新他们的标签,所以我想做的是自动从 MySQL 表中删除任何标签,如果它不再存在于列表中

例如,用户在 Web 表单上输入以下内容:

trance, house, electronica, dubstep, club

然而,MySQL 表有这个

userid    tag
1         trance
1         house
1         electronica
1         dubstep
1         garage

我想从 MySQL 中删除车库标签并添加“俱乐部”。

还值得注意的是,虽然这些标签在我上面的示例中按顺序出现,但情况并非总是如此,因此我不能依赖于数组索引位置,例如。

我意识到我可以用 foreach 遍历逗号分隔的列表并生成一个删除语句,然后从头开始重新插入所有标签,但我觉得可能有更好的方法来做到这一点。

提前感谢您的指导。

戴夫

4

2 回答 2

0

您只需将逗号分隔的列表放置(在正确转义和引用之后)到一个 子句中,并在如下语句NOT IN()中使用它。DELETE顺序无关紧要。

DELETE FROM tags WHERE userid = 1 AND tag NOT IN ('trance', 'house', 'electronica', 'dubstep', 'club');

您如何转义和引用逗号分隔值将取决于您使用的数据库 API,无论是 PDO、MySQLi 还是旧的(即将被弃用的)mysql_*()函数。

我会注意到您通过每行存储一个标签而不是将它们作为 CSV 列表存储在单个列中来做正确的事情。

于 2012-06-16T13:31:06.430 回答
0

假设

  • 兴趣名称中允许使用 noc 逗号,
  • 并且桌子上有一个 UNIQUE INDEX(userid,tag)

做类似的事情

$s="trance, house, electronica, dubstep, club";
$userid=1;

$s=explode(',',$s);
$i=0;
foreach($s as $ss) {
  $ss=trim($ss);
  //Escape the string according to your DB framework
  //e.g. $ss=mysql_escape_string($ss);
  $s[$i++]=$ss;
}

$ss=implode("','",$s);
$sql="DELETE FROM tablename WHERE userid=$userid AND tag NOT IN('$ss')";
//Run $sql accodring to your DB framework

if (sizeof($s)>0) {
  $i=0;
  foreach($s as $ss) $s[$i++]="'$userid','$ss'";
  $ss=implode('),(',$s);
  $sql="INSERT IGNORE INTO tablename VALUES ($ss)";
  //Run $sql accodring to your DB framework
}
于 2012-06-16T13:41:28.510 回答