【发布时间】:2013-03-22 07:36:19
【问题描述】:
你好,我有一张下表
------------------------------------------
| 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 |
------------------------------------------
场景
每条记录在表中都有多个具有不同language id 的行。 parentid 告诉谁是这条记录的父级。 no_daughter 列告诉每条记录一条记录有多少个子记录。理想情况下的方法如果 no_daughter 的值 2 of id = 1 ,则意味着 1 应该是同一表中 2 条记录的 parentid。 但如果一条记录在语言方面有多个存在,则将其视为一条记录。
我的问题
我需要找出那些no_daughter 值不正确的记录。这意味着如果no_daughter 为2,则必须有两条记录parentid 具有该ID。在上述情况下,id = 1 的记录是有效的。但是具有id = 2 的记录无效,因为no_daughter = 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
此查询返回那些在表中某处用作parentid 但no_daughter 值错误的ID。但不返回在no_daugter 列中具有值但未在表中的任何位置用作parentid 的ID。例如 id = 5 有 no_daughter = 1 但它不用作表中的 parentid。所以这也是一个错误的记录。但是上面的查询没有捕获这样的记录。
任何帮助将不胜感激。
【问题讨论】:
标签: mysql join inner-join