我有以下表tbl_info
---------------------------------------
| id | parentid | sortsequence |
|--------------------------------------
| 1 | 0 | 1 |
|--------------------------------------
| 2 | 1 | 1 |
|--------------------------------------
| 3 | 1 | 1 |
|--------------------------------------
| 4 | 1 | 2 |
|--------------------------------------
| 5 | 0 | 1 |
|--------------------------------------
| 6 | 5 | 1 |
|-------------------------------------|
| 7 | 5 | 2 |
我的问题
我需要查找那些记录及其子id(其中某些记录的id存在为parentid)的id,其子列的sortsequence
列不是唯一的。例如,如果id 1
有子项2,3,4
,那么2,3,4
的排序顺序必须是唯一的。如果它们不是唯一的,它们是错误的记录,我需要找出这些记录。
更新
父子关系来自id
和parentid
字段。如果某些记录的id
作为其他记录的parentid
存在,那么这些其他记录就是这些记录的子记录。 现在我需要找出那些parentid
相同但sortsequence不唯一的记录。理想条件和正确条件是所有parentid相同的记录然后sortsequence必须是unqiue。在上面的情况下,记录2,3,4
是错误的记录。我需要找出这些记录
到目前为止我做了什么
我搜索了很多并写了这个查询
SELECT id, parentid, tbl_info.sortsequence FROM tbl_info
INNER JOIN (SELECT sortsequence FROM tbl_info
GROUP BY sortsequence HAVING COUNT(id) > 1) dup ON tbl_info.sortsequence = dup.sortsequence
此查询首先查找排序序列相同的所有记录,但我需要找出parentid
的记录。其次我在这个表中有数百万条记录,所以我需要一个处理时间最短的查询。
答案 0 :(得分:0)
如果只是在有缺陷的条件下加入两个表怎么样?如果有相同的父级你就不能有相同的排序......
SELECT child.id AS [thischild]
, child.sortsequence AS [isinthespot]
, sibling.id AS [allongwiththissibling]
FROM tbl_info child
INNER JOIN tbl_info sibling ON child.parentid = sibling.parentid --sameparent
AND child.sortsequence = sibling.sortsequence --and in sameplace
WHERE child.parentid > 0 --remove roots
AND child.id < sibling.id --remove duplicate return (because 2 is in same spot as 5 AND 5 is in the same spot as 2 )
答案 1 :(得分:0)
同样如果我理解正确:
SELECT * FROM tbl_info WHERE parentid in (
SELECT parentid FROM tbl_info
GROUP BY parentid
HAVING COUNT(DISTINCT sortsequence) <> COUNT(sortsequence)
)
答案 2 :(得分:0)
尝试此查询
SELECT
distinct b.id
FROM
tbl b,
(select
t1.parentid AS rId
FROM
tbl t1
group by
t1.parentid
HAVING
count(t1.parentid) <> count(distinct t1.sortsequence)
) a
WHERE
a.rId = b.id or
a.rId = b.parentId;
内部查询列表是不具有唯一排序顺序的parentId,其结果用于列出该id的父级和子级。
希望这有帮助