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。谢谢答案已更新。