【问题标题】:How to find missing data either in array or in mySQL table?如何在数组或 mySQL 表中查找丢失的数据?
【发布时间】:2008-12-13 02:02:31
【问题描述】:

我有一个填充了值(twitter ids)的数组,我想在最低 id 和最高 id 之间找到缺失的数据?是否愿意分享一个简单的功能或如何做到这一点的想法?

另外,我想知道我是否可以用 mySQL 做同样的事情?我有键索引。该表现在包含 250k 行,因此临时表和连接不会非常快速或高效。我可以做一个 PHP 循环来循环遍历数据,但这也需要很长时间,并且需要大量内存。我可以运行特定的 mysql 查询吗?或者我可以以某种方式使用上面的函数吗?

谢谢, 詹姆斯·哈蒂格 http://twittertrend.net

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我有一个类似的需求,并写了一个函数来返回一个缺失 ID 的列表。

    ---------------------------
    create function dbo.FreeIDs ()
    ---------------------------
    returns @tbl table (FreeID int)
    
    as
    begin
    
        declare @Max int
        declare @i int
    
        select @Max = MAX(ID) from [TheTable]
        set @i = 0
    
        while @i < @Max begin
              set @i = @i + 1
              if not exists (select * from [TheTable] where ID = @i) 
                 insert into @tbl select @i
        end
    
        return
    
    end
    

    【讨论】:

      【解决方案2】:

      您是指顺序 ID 吗?

      这样的话

      $new_ids = range($lowid, $highid, 1);
      $ids = array_merge($ids, $new_ids);
      $ids = array_unique($ids);
      sort($ids);
      

      在 SQL 中(带占位符)

      SELECT key, other_data from `table` WHERE key > :low_id AND key < :high_id
      

      【讨论】:

      • 你的sql语句没有意义?它只会返回最大值和最小值之间的所有ID?它不会找到缺失值。
      • 您如何“找到”缺失值...他检索现有值并从整个范围中减去这些值。应该工作
      • sql 查询查找数据库中所有介于高低键之间的值。这就是我理解你的问题的意思。如果您想查找不在数据库中的键,我认为所有解决方案都将涉及临时表(隐式或显式)和连接。
      【解决方案3】:

      你的 range() 给了我一个好主意,你的代码不能作为唯一的保留唯一键,所以我只剩下范围函数的结果。

      但是,这行得通:

      $diff = array_values(array_diff(range(min($array), max($array), 1), $array)); //returns array of incomplete values
      

      【讨论】:

      • 您可以只使用 array_values 作为他的解决方案。您没有指定应该重置键,只是缺少 id 的列表。但是这个解决方案就像我自己做的一样。
      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多