1

我已经为此绞尽脑汁已经有一段时间了。所以是时候问问大家了。我有以下(简化的)MySQL 表,名为“fam”:

+--------------+------------+------------+-----------+-----------+
+ Year         + ParentID1  + ParentID2  + ChildID1  + ChildID2  +
+--------------+------------+------------+-----------+-----------+
+ 1970         + 1111       + 2222       + 3333      + 4444      +
+ 1975         + 1111       + 3434       + 4545      + 5656      +
+ 1980         + 2222       + 3344       + 5566      + 6677      +
+ 1990         + 5656       + 3333       + 9090      + 0909      +
+ 1995         + 4444       + 5656       + 1010      + 1313      +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我基本上想要实现的是检查有多少孩子后来自己成为了父母。我认为这样的事情可能会奏效

SELECT COUNT(fam1.ChildID1)+COUNT(fam1.ChildID2) as `recruits`
FROM fam fam1
JOIN fam fam2
ON (fam1.ChildID1=fam2.ParentID1 OR fam1.ChildID1=fam2.ParentID2) 
OR (fam1.ChildID2=fam2.ParentID1 OR fam1.ChildID2=fam2.ParentID2) 

但是,唉,新兵不是 8 人,而是只有 3 人(3333、4444 和 5656)。对我来说最大的问题是如何解释 ID 可以出现在不同列中的事实(例如 5656 在 1990 年的第 1 列和 1995 年的第 2 列)。

任何建议将不胜感激!

4

2 回答 2

1

这很容易,你只需要检查一个孩子是否已经成为父母......因为每个家庭都有两个孩子,你需要做两次(一个孩子一个,另一个孩子两个),你应该有清单所有成为父母的孩子。将它们列入列表后,您只需计算它们,无需将简单的事情复杂化;)

  select count (*) from
    (
        select child1 from fam
         where child1 in 
            (select parent1 from fam 
               union 
              select parent2 from fam)

        union

        select child2 from fam
         where child2 in 
           (select parent1 from fam 
             union
            select parent2 from fam)

    );
于 2013-06-17T11:07:39.483 回答
1

检查这个

    select count(*) as `recruits` from
    (
     select  ChildID1 from fam
     where ChildID1 in 
     (select ParentID1 from fam 
       union 
      select ParentID2 from fam)
     union

     select ChildID2 from fam
     where ChildID2 in 
     (select ParentID1 from fam 
     union
     select ParentID2 from fam)

    )t;

演示

于 2013-06-17T11:14:57.800 回答