7

こんにちは私は次のようなテーブルを持っています

-----------------------------------------------------------
|  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        |   
-----------------------------------------------------------

シナリオ

処理する必要がある2つのシナリオがあります。

  1. Sortsequence列の値は、1source_idとに対して一意である必要がありgroup_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_idsortsequence 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を処理する方法は?同じクエリでそれを行う方法はありますか、または2番目のシナリオを処理するために他を作成する必要があります。

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

4

2 に答える 2

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

それは他の人を助けることができるかもしれません。

于 2013-03-27T09:57:38.963 に答える
0

このクエリを試してみてください。質問で述べたように、両方のケースが解決されます。

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;

フィドル

于 2013-03-26T08:01:53.510 に答える