【问题标题】:how to write this self join based on three columns如何根据三列编写此自联接
【发布时间】: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 

此查询返回那些在表中某处用作parentidno_daughter 值错误的ID。但不返回在no_daugter 列中具有值但未在表中的任何位置用作parentid 的ID。例如 id = 5no_daughter = 1 但它不用作表中的 parentid。所以这也是一个错误的记录。但是上面的查询没有捕获这样的记录。

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql join inner-join


    【解决方案1】:

    试试这个:

    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 
    

    【讨论】:

      【解决方案2】:

      试试这个:

      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
      

      【讨论】:

      • 没有一致的结果。表示不返回实际结果
      【解决方案3】:

      试试这个

       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
      

      【讨论】:

      • 我已经更新了我的问题。请看一下
      • 将内连接更改为左连接以获取在 no_daugter 列中具有值但在表中的任何位置都没有用作 parentid 的 id。谢谢。答案已更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 2017-01-26
      • 2011-08-11
      • 1970-01-01
      • 2016-07-30
      相关资源
      最近更新 更多