你好,我有一个类似下面的表格:
-----------------------------------------------------------
| 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 |
-----------------------------------------------------------
场景
需要处理两种情况:
Sortsequence
列的值应在一个source_id
和group_id
中是唯一的。例如,如果所有记录都具有group_id = 1 AND source_id = 2
,则 sortsequence 应该是唯一的。在上面的示例中,具有id=5
和6
的记录,其group_id = 1
和source_id = 2
,它们具有相同的 sortsequence 值,即 1,这是错误的记录。我需要找出这些记录。- 如果
group_id 和 source_id
相同,则sortsequence列的值应该是连续的。不应存在间隔
。例如,在上表中,具有id = 20, 21
的记录具有相同的 group_id 和 source_id,并且它们的 sortsequence 值分别为 3 和 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?有没有办法在同一个查询中处理它,还是我需要编写其他内容来处理第二个场景。
顺便说一下,查询将处理表中数百万条记录,因此性能必须非常好。
COUNT(DISTINCT sortsequence) <> COUNT(sortsequence) OR COUNT(sortsequence) <> MAX(sortsequence)
的组,可以同时检测到这两个问题。 - Terje D.