【问题标题】:how to find duplicates and gaps in this scenario in mysql如何在mysql中找到这种情况下的重复和空白
【发布时间】:2013-03-15 21:44:40
【问题描述】:

嗨,我有一张看起来像这样的桌子

-----------------------------------------------------------
|  id  |  group_id | source_id | target_id | sortsequence |
-----------------------------------------------------------
|  2   |    1      |    2      |   4       |     1        |   
-----------------------------------------------------------
|  4   |    1      |    20     |   2       |     1        |   
-----------------------------------------------------------
|  5   |    1      |    2      |   14      |     1        |   
-----------------------------------------------------------
|  7   |    1      |    2      |   7       |     3        |   
-----------------------------------------------------------
|  20  |    2      |    20     |   4       |     3        |   
-----------------------------------------------------------
|  21  |    2      |    20     |   4       |     1        |   
-----------------------------------------------------------

场景

有两种情况需要处理。

  1. Sortsequence 列值对于source_idgroup_id 应该是唯一的。例如,如果所有具有group_id = 1 AND source_id = 2 的记录都应该具有唯一的排序序列。在上面的示例记录中具有id= and 5 which are having group_id = 1 and source_id = 2 have same sortsequence which is 1。这是错误的记录。我需要找出这些记录。
  2. 如果group_id and source_id 相同。 sortsequence columns value should be continous. There should be no gap。例如上表records having id = 20, 21 having same group_id and source_id and sortsequence value is 3 and 1。即使这是唯一的,但 sortsequence 值也存在差距。我还需要找出这些记录。

我迄今为止的努力

我已经写了一个查询

SELECT source_id,`group_id`,GROUP_CONCAT(id) AS children 
FROM
    table 
GROUP BY source_id,
  sortsequence,
  `group_id` 
 HAVING COUNT(*) > 1 

这个查询只针对场景1。如何处理场景2?有没有办法在同一个查询中做到这一点,或者我必须编写其他方法来处理第二种情况。

By the way query will be dealing with million of records in table so performance must be very good.

【问题讨论】:

  • 排序顺序总是从 1 开始吗?如果是这样,您可以获取 (source_id, group_id) 的排序序列的计数和总和,并应用 n 个数字总和的公式
  • @ChetterHummin 是的,它必须从 1 开始
  • 然后我会对这些值求和,看看它是否等于 count*(count+1)/2。不过,这可能需要一个内部查询。 Oracle 可能会提供一些分析功能来为您执行此操作。但我不知道mysql中的等价物
  • @Chetter Hummin 仅按 group_id 和 source_id 分组,然后检查 COUNT(DISTINCT sortsequence) <> COUNT(sortsequence) OR COUNT(sortsequence) <> MAX(sortsequence) 应该同时检测到这两个问题的组。

标签: mysql select


【解决方案1】:

得到Tere J评论的答复。以下查询涵盖了上述两个条件。

 SELECT 
     source_id, `group_id`, GROUP_CONCAT(id) AS faultyIDS    
 FROM
     table
 GROUP BY
     source_id,group_id 
 HAVING
     COUNT(DISTINCT sortsequence) <> COUNT(sortsequence) OR COUNT(sortsequence) <> MAX(sortsequence) OR MIN(sortsequence) <> 1

也许它可以帮助别人。

【讨论】:

    【解决方案2】:

    试试这个查询,它会解决你在问题中提到的两种情况。

    SELECT 
       a.* 
    FROM 
       tbl a
    INNER JOIN 
       (select 
           @rn:=IF(@prevG = group_id AND @prevS = source_id, @rn + 1, 1) As rId,
           @prevG:=group_id AS group_id, 
           @prevS:=source_id AS source_id, 
           id, 
           sortsequence
        FROM 
           tbl 
        join 
           (select @rn:=0, @prevS:=0, @prevG:=0)b
        order by group_id, source_id, id) b
    ON a.id = b.id AND a.SORTSEQUENCE <> b.RID;
    

    FIDDLE

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多