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;