如何编写这种类型的内连接

时间:2013-03-08 09:58:55

标签: mysql group-by inner-join

我有以下表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的排序顺序必须是唯一的。如果它们不是唯一的,它们是错误的记录,我需要找出这些记录。

评论后

更新

父子关系来自idparentid字段。如果某些记录的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的记录。其次我在这个表中有数百万条记录,所以我需要一个处理时间最短的查询。

3 个答案:

答案 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的父级和子级。

希望这有帮助

Fiddle