在mySQL表中检查数组项存在的最快方法
用户写入一系列标签(分隔)并发布表单。
我构建了一个包含标签的数组,并使用array_unique() php函数删除模糊。在mySQL表中检查数组项存在的最快方法
我想这样做的:
- 经过用foreach($ newarray为$项目)的阵列{...}
- 检查在标签MySQL表 存在每个$项目
- 如果项目不存在,插入标签表
是否有一个更快或更优化方式这样做?
我希望人们可以评论这种方法。直觉告诉我它可能不是最好的办法,但你们都在想什么?
只需在数据库中添加一个唯一的约束,以便标记不能被插入两次,而不是对数据库进行额外调用以查找重复项。然后在添加新标签时使用INSERT IGNORE...
。此方法将忽略由重复引起的错误,同时插入新项目。
您可以拨打implode(',' $array)
,然后使用IN
SQL构造来检查数据库中是否存在现有的行。
例子:
<?php
$arr = ...
$sql = 'SELECT COUNT(*) FROM table WHERE field IN (' . implode(',', $arr) . ');';
$result = $db->query($sql);
?>
我想你的意思是说'implode(',',$ array)'。你可以使用'explode()'将一个字符串转换成一个数组。 – awgy 2010-04-12 21:43:54
您还定义了'$ arr',然后使用'$ array'。 – 2010-04-12 21:49:08
@awgy,@Jack谢谢 – 2010-04-12 21:56:22
$tags = array('foo', 'bar');
// Escape each tag string
$tags = array_map('mysql_real_escape_string', $tags, array($sqlCon));
$tagList = '"' . implode('", "', $tags) . '"';
$qs = 'SELECT id FROM tag_list WHERE tag_name IN (' . $tagList . ')';
你可以建立一个大的查询,并做到在一杆,而不是许多小疑问:
SELECT DISTINCT tag
FROM my_tags
WHERE tag in (INPUT_TAGS)
刚刚建立INPUT_TAGS作为一个逗号分隔的列表,并确保你正确逃生的每个元素防止SQL注入攻击。
+1这正是我要做的。除非你特别需要用重复的逻辑来处理标签,否则我会'插入IGNORE'并忘记它。当INSERT IGNORE为你做什么时,为什么还要单独使用'SELECT'和循环来删除'INSERT'中的重复数据呢? – zombat 2010-04-12 21:53:03
我会认为这会很好,特别是因为它会使重复查找'SELECT'变得多余。但是,可能有必要对这两种方法进行基准测试。 – awgy 2010-04-12 22:05:02
@thetaiko。我的标签表有: - id:primary,autoinc - title:varchar(50) 应该如何添加重复的约束? – Enrique 2010-04-12 22:14:56