检查mySQL表中数组项存在的最快方法

时间:2010-04-12 21:37:27

标签: php mysql performance foreach

用户编写一系列标签(,分开)并张贴表格 我使用 array_unique() php函数构建一个包含标签和删除dupes的数组。

我正在考虑这样做:

  • 使用foreach($ newarray as $ item){...}
  • 遍历数组
  • 检查标签mySQL table
  • 中每个$ item是否存在
  • 如果项目不存在,请插入标签表

是否有更快更多OPTIMUM 这样做?

5 个答案:

答案 0 :(得分:4)

我希望人们可以评论这种方法。直觉告诉我它可能不是最好的方法,但你们都有什么想法?

不要额外调用DB来查找重复项,只需在DB中添加一个唯一约束,这样就不能插入两次标记。然后在添加新标记时使用INSERT IGNORE...。此方法将忽略重复导致的错误,同时插入新项目。

答案 1 :(得分:2)

您可以调用implode( ',' $array ),然后使用IN SQL构造来检查数据库中是否存在现有行。

示例:

<?php
   $arr = ...
   $sql = 'SELECT COUNT(*) FROM table WHERE field IN ( ' . implode( ',', $arr ) . ' );';
   $result = $db->query( $sql );
?>

答案 2 :(得分:1)

$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 . ')';

答案 3 :(得分:0)

我不知道它是否更快,但您可以使用mysql's IN。我想你必须尝试。

答案 4 :(得分:0)

你可以建立一个大的查询并一次完成,而不是许多小查询:

SELECT DISTINCT tag
  FROM my_tags
 WHERE tag in ( INPUT_TAGS )

只需将INPUT_TAGS构建为以逗号分隔的列表,并确保正确转义每个元素以防止SQL注入攻击。