代码之家  ›  专栏  ›  技术社区  ›  Enrique

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

  •  1
  • Enrique  · 技术社区  · 14 年前

    用户编写一系列标记(,分隔)并发布表单。
    我构建了一个包含标签的数组,并用 单位() PHP函数。

    我想做:

    • 使用foreach($newarray as$item)遍历数组…}
    • 检查每个$item是否存在于标记mysql表中
    • 如果项不存在,请插入到标记表中

    有没有 更快 更优化 怎么做?

    5 回复  |  直到 13 年前
        1
  •  4
  •   thetaiko    14 年前

    我希望人们能对这种方法发表评论。直觉告诉我,这可能不是解决问题的最佳方法,但你们都有什么想法?

    只需在数据库中添加一个唯一的约束,这样标签就不能被插入两次,而不需要额外调用数据库来查找重复项。然后使用 INSERT IGNORE... 添加新标签时。此方法将在插入新项的同时忽略由重复引起的错误。

        2
  •  2
  •   Pyrolistical    14 年前

    你可以打电话 implode( ',' $array ) 然后使用 IN 用于检查数据库中是否存在行的SQL构造。

    例子:

    <?php
       $arr = ...
       $sql = 'SELECT COUNT(*) FROM table WHERE field IN ( ' . implode( ',', $arr ) . ' );';
       $result = $db->query( $sql );
    ?>
    
        3
  •  1
  •   awgy    14 年前
    $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 . ')';
    
        4
  •  0
  •   jeroen    14 年前

    我不知道它是否更快,但你可以用 mysql's IN . 我想你得试试。

        5
  •  0
  •   Justin Ethier    14 年前

    您可以构建一个大查询并一次性完成,而不是进行许多小查询:

    SELECT DISTINCT tag
      FROM my_tags
     WHERE tag in ( INPUT_TAGS )
    

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