Mysql 如何基于三列编写此自联接

Mysql 如何基于三列编写此自联接,mysql,join,inner-join,Mysql,Join,Inner Join,你好,我有一张桌子 ------------------------------------------ | id | language | parentid | no_daughter | ------------------------------------------ | 1 | 1 | 0 | 2 | ------------------------------------------ | 1 | 1 | 0

你好,我有一张桌子

------------------------------------------
| id | language | parentid | no_daughter |
------------------------------------------
| 1  |     1    |    0     |      2      |
------------------------------------------
| 1  |     1    |    0     |      2      |
------------------------------------------
| 2  |     1    |    1     |      1      |
------------------------------------------
| 2  |     2    |    1     |      1      |
------------------------------------------
| 3  |     1    |    1     |      0      |
------------------------------------------
| 3  |     2    |    1     |      0      |    
------------------------------------------
| 4  |     1    |    2     |      0      |
------------------------------------------
| 4  |     2    |    2     |      0      |
------------------------------------------
| 5  |     1    |    2     |      0      |
------------------------------------------
| 5  |     2    |    2     |      1      |
-----------------------------------------
| 5  |     1    |    4     |      1      |
------------------------------------------
| 5  |     2    |    4     |      1      |
------------------------------------------
情景

每个记录在具有不同语言ID的表中都有多行。parentid告诉谁是此记录的父项。没有子列告诉每个记录一条记录有多少子记录。在理想情况下,如果没有_子元素具有id=1的值2,则意味着1应该是同一表中2条记录的parentid。但是,如果一个记录在语言上有多个存在,它将被视为一个记录

我的问题

我需要找出那些无子元素值不正确的记录。这意味着,如果没有子项为2,则必须有两个parentid具有该id的记录。在上述情况下,id=1的记录是有效的。但是id为2的记录无效,因为此记录的no_子项为1,但实际子项为2。id=4的情况也是如此

有人能告诉我怎样才能找到这些错误的记录吗

更新后的答案

Ken Clark和shola给出了返回相同结果的答案,例如shola查询是

SELECT DISTINCT 
id 
FROM
tbl_info t 
INNER JOIN 
  (SELECT 
    parentid,
    COUNT(DISTINCT id) AS childs 
  FROM
    tbl_info 
  GROUP BY parentid) AS parentchildrelation 
  ON t.id = parentchildrelation.parentid 
  AND t.no_daughters != parentchildrelation.childs 
此查询返回的ID已在表中的某个位置用作parentid,但没有错误的no_子项值。但不返回在no_daugter列中有值但未在表中任何位置用作parentid的ID。例如,id=5没有_子元素=1,但在表中未用作parentid。所以这也是一个错误的记录。但上面的查询并没有捕获这样的记录

任何帮助都将不胜感激。

试试以下方法:

SELECT id FROM tinfo t inner join
(SELECT parentid, COUNT(distinct language ) as childs FROM tinfo group by parentid) as     summary
on t.id=summary.parentid and t.no_daughters!= summary.childs
SELECT DISTINCT 
      id 
FROM
   tbl_info t 
Left JOIN 
   (SELECT 
       parentid,
       COUNT(DISTINCT id) AS childs 
   FROM
       tbl_info 
   GROUP BY parentid) AS parentchildrelation 
   ON t.id = parentchildrelation.parentid 
  Where t.no_daughters != parentchildrelation.childs 
试试这个:

SELECT id FROM tinfo t inner join
(SELECT parentid, COUNT(distinct language ) as childs FROM tinfo group by parentid) as     summary
on t.id=summary.parentid and t.no_daughters!= summary.childs
SELECT DISTINCT 
      id 
FROM
   tbl_info t 
Left JOIN 
   (SELECT 
       parentid,
       COUNT(DISTINCT id) AS childs 
   FROM
       tbl_info 
   GROUP BY parentid) AS parentchildrelation 
   ON t.id = parentchildrelation.parentid 
  Where t.no_daughters != parentchildrelation.childs 
试试这个

 Select Distinct * From tablename t
 Left Join
 (
   Select COUNT(t1.Id) Doughter,t1.parentid,t1.language From tablename  t1 Group By t1.parentid,t1.language
 )tbl
 On t.id=tbl.parentid And tbl.language=t.language And t.no_daughter<>tbl.Doughter
试试这个

 Select Distinct * From tablename t
 Left Join
 (
   Select COUNT(t1.Id) Doughter,t1.parentid,t1.language From tablename  t1 Group By t1.parentid,t1.language
 )tbl
 On t.id=tbl.parentid And tbl.language=t.language And t.no_daughter<>tbl.Doughter
试试这个:

SELECT id FROM tinfo t inner join
(SELECT parentid, COUNT(distinct language ) as childs FROM tinfo group by parentid) as     summary
on t.id=summary.parentid and t.no_daughters!= summary.childs
SELECT DISTINCT 
      id 
FROM
   tbl_info t 
Left JOIN 
   (SELECT 
       parentid,
       COUNT(DISTINCT id) AS childs 
   FROM
       tbl_info 
   GROUP BY parentid) AS parentchildrelation 
   ON t.id = parentchildrelation.parentid 
  Where t.no_daughters != parentchildrelation.childs 
试试这个:

SELECT id FROM tinfo t inner join
(SELECT parentid, COUNT(distinct language ) as childs FROM tinfo group by parentid) as     summary
on t.id=summary.parentid and t.no_daughters!= summary.childs
SELECT DISTINCT 
      id 
FROM
   tbl_info t 
Left JOIN 
   (SELECT 
       parentid,
       COUNT(DISTINCT id) AS childs 
   FROM
       tbl_info 
   GROUP BY parentid) AS parentchildrelation 
   ON t.id = parentchildrelation.parentid 
  Where t.no_daughters != parentchildrelation.childs 

没有一致的结果。表示不返回实际结果,结果不一致。意味着不返回实际结果我已经回答了我的问题。请将lookChange内部联接更改为left联接,以获取在no_daugter列中有值但未在表中任何位置用作parentid的ID。谢谢答案更新。我已经回答了我的问题。请将lookChange内部联接更改为left联接,以获取在no_daugter列中有值但未在表中任何位置用作parentid的ID。谢谢答案已更新。