【问题标题】:Fastest way to check array items existence in mySQL table检查 mySQL 表中是否存在数组项的最快方法
【发布时间】:2023-03-17 04:32:01
【问题描述】:

用户编写一系列标签(,分隔)并发布表单。
我构建了一个包含标签的数组,并使用 array_unique() php 函数删除了欺骗。

我正在考虑做:

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

有没有更快更优化的方法来做到这一点?

【问题讨论】:

    标签: php mysql performance foreach


    【解决方案1】:

    我希望人们可以评论这种方法。直觉告诉我,这可能不是处理事情的最佳方式,但你们觉得呢?

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

    【讨论】:

    • +1 这正是我要做的。除非您特别需要在存在重复项时使用某些逻辑处理标签,否则我会 INSERT IGNORE 并忘记它。当INSERT IGNORE 为你做这件事时,为什么还要打扰一个单独的SELECT 并循环只是为了从INSERT 中删除重复数据?
    • 我认为这会很好,特别是因为它会使重复查找 SELECT 变得多余。不过,为了确定,对这两种方法进行基准测试可能是值得的。
    • @thetaiko。我的标签表有: - id: primary, autoinc - title: varchar(50) 我应该如何添加重复项约束?
    • @Enrique - ALTER TABLE `tags` ADD UNIQUE `unique_title` (`title`);
    • 太棒了!我错了,添加了一个索引索引而不是唯一的。感谢您的帮助!
    【解决方案2】:

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

    例子:

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

    【讨论】:

    • 我想你的意思是说implode(',', $array)。您可以使用explode() 将字符串转换为数组。
    • 您还定义了$arr,然后使用了$array
    • 另外,请注意此处的潜在安全问题。 $arr 中的字符串永远不会被转义。这可以通过以下方式纠正:$arr = array_map('mysql_real_escape_string', $arr, array($mySqlConn));(其中$mySqlConnmysql_connect() 返回的资源)
    • 我知道这是 4 年后的事了,但是您将如何检索数组的哪些部分不在表中?某种获取??
    【解决方案3】:
    $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 . ')';
    

    【讨论】:

    • 如果您对 SQL 注入如此谨慎,那么您不应该忘记它们周围的引号。
    • 如此真实——这就是我急于回应的结果。 :)
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      SELECT DISTINCT tag
        FROM my_tags
       WHERE tag in ( INPUT_TAGS )
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-16
        • 2022-06-06
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 2014-10-26
        相关资源
        最近更新 更多