Mysql 本质上,这是相同的解决方案,因为查询、计数器和比较的工作方式相同。非常感谢你们两位!!仅供参考,我在下面发布了我的实现: PassportID – ParentNAME 098765432 – Kate 012345678 – John 11122233

Mysql 本质上,这是相同的解决方案,因为查询、计数器和比较的工作方式相同。非常感谢你们两位!!仅供参考,我在下面发布了我的实现: PassportID – ParentNAME 098765432 – Kate 012345678 – John 11122233,mysql,sql,variables,Mysql,Sql,Variables,本质上,这是相同的解决方案,因为查询、计数器和比较的工作方式相同。非常感谢你们两位!!仅供参考,我在下面发布了我的实现: PassportID – ParentNAME 098765432 – Kate 012345678 – John 111222333 – Mary PassportID – ChildNAME – ParentID 211222333 – Peter – 111222333 222333444 – Gabriel – 012345678 222222222 – Lar


本质上,这是相同的解决方案,因为查询、计数器和比较的工作方式相同。非常感谢你们两位!!仅供参考,我在下面发布了我的实现:
PassportID – ParentNAME

098765432 – Kate
012345678 – John
111222333 – Mary
PassportID – ChildNAME – ParentID

211222333 – Peter – 111222333
222333444 – Gabriel – 012345678
222222222 – Lara – 111222333
233333333 – Angela – 012345678
244444444 – Philip – 012345678
255555555 – Michael – 111222333
277777777 – Betty – 098765432
266666666 – Eleanor – 098765432
299999999 – Amanda – 111222333
288888888 – Robert – 111222333
ParentAgeRANK - ParentNAME – ChildBornRANK – ChildNAME

1 – John – 1 – Gabriel
1 – John – 2 – Angela
1 – John – 3 – Philip
2 – Kate – 1 – Eleanor
2 – Kate – 2 – Betty
3 – Mary – 1 – Peter
3 – Mary – 2 – Lara
3 – Mary – 3 – Michael
3 – Mary – 4 – Robert
3 – Mary – 5 – Amanda
SELECT 
    (SELECT Count(*) FROM Parents sub
     WHERE sub.PassportID <= p.PassportID) AS ParentRANK,

    p.PassportID As ParentID, p.ParentNAME, 

    (SELECT Count(*) FROM Children sub
     WHERE sub.PassportID <= c.PassportID
     AND sub.ParentID = c.ParentID) AS ChildRANK,

    c.PassPortID As ChildID, c.ChildNAME    

FROM Parents p 
INNER JOIN Children c 
  ON p.PassportID = c.ParentID
SELECT 
       Count(DISTINCT subP.PassportID) AS ParentRANK,
       p.PassportID As ParentID, p.ParentNAME,        
       Count(DISTINCT subC.PassportID) AS ChildRANK,        
       C.PassPortID As ChildID, c.ChildNAME

FROM Parents p 
INNER JOIN Children c 
  ON p.PassportID = c.ParentID

LEFT JOIN Parents subP
  ON subP.PassportID <= p.PassportID

LEFT JOIN Children subC   
  ON subC.PassportID <= c.PassportID
  AND subC.ParentID = c.ParentID

GROUP BY p.PassportID, p.ParentName, c.PassportID, c.ChildName
ORDER BY 1,4
SELECT CASE WHEN @prev = x.parent_id THEN @i:=@i ELSE @i:=@i+1 END parentrank 
     , x.parentname
     , CASE WHEN @prev = x.parent_id THEN @j:=@j+1 ELSE @j:=1 END childrank
     , x.childname
     , @prev:=parent_id
  FROM ( SELECT p.passportid parent_id
            , p.parentname
            , c.passportid child_id
            , c.childname
         FROM parents p
         JOIN children c
           ON c.parentid = p.passportid
       ) x
  JOIN ( SELECT @prev:=null,@i:=0,@j:=0) vars
 ORDER 
    BY x.parent_id
     , x.child_id;
+------------+------------+-----------+-----------+------------------+
| parentrank | parentname | childrank | childname | @prev:=parent_id |
+------------+------------+-----------+-----------+------------------+
|          1 | John       |         1 | Gabriel   |         12345678 |
|          1 | John       |         2 | Angela    |         12345678 |
|          1 | John       |         3 | Philip    |         12345678 |
|          2 | Kate       |         1 | Eleanor   |         98765432 |
|          2 | Kate       |         2 | Betty     |         98765432 |
|          3 | Mary       |         1 | Peter     |        111222333 |
|          3 | Mary       |         2 | Lara      |        111222333 |
|          3 | Mary       |         3 | Michael   |        111222333 |
|          3 | Mary       |         4 | Robert    |        111222333 |
|          3 | Mary       |         5 | Amanda    |        111222333 |
+------------+------------+-----------+-----------+------------------+
SET @prank=0, @crank=1, @curp=0, @curc=0;

SELECT 
  if(o.Passportid<>@curp, @prank:=@prank+1, @prank) as 'ParentRANK', 
  o.ParentName,
  if(o.Passportid<>@curp, @crank:=1, @crank:=@crank+1) as 'ChildRANK', 
  o.ChildName, 
  if(o.Passportid<>@curp, @curp:=o.Passportid, @curp) as 'current_P' 
FROM (
  SELECT p.Passportid,p.ParentNAME, c.PassportID as childID,c.ChildNAME,c.ParentID 
  FROM parents AS p INNER JOIN children as c on p.PassportID=c.ParentID 
  ORDER BY p.PASSPORTID,c.PassportID
) AS o;