5

你好,我有一张类似于这张的桌子:

id     sponsor     name
------------------------
1      0          Sasha
2      1          John
3      1          Walter
4      3          Ashley
5      1          Mark
6      4          Alexa       
7      3          Robert
8      3          Frank
9      4          Marika
10     5          Philip
11     9          Elizabeth

当我选择一个 ID(称为 MYCHOICE)时,我想知道所有拥有像 MYCHOICE 这样的赞助商的人的姓名……很简单:

从表名中选择 *,其中赞助商 = MYCHOICE

但是...这是问题所在...我会知道此结果的下线中有多少人...所以...有多少记录与赞助商一样每个ID。

如果我选择 id 1 结果应该是

id  name     downline
----------------------
2   John     0              (noone with sponsor=2)
3   Walter   3              (3 with sponsor=3: ashley, robert, frank)
5   Mark     1              (1 with sponsor=5: philip)

如果我选择 id 4 结果应该是

id  name     downline
----------------------
6   Alexa    0
9   Marika   1   (1 with sponsor=9: Elizabeth)

如果 mychoice 是 1,我会尝试这个“糟糕的解决方案”

从赞助商所在的表名中选择赞助商,计数(*)作为下线(从赞助商= 1的表名中选择id)按赞助商顺序按下线描述

这个查询的结果是

sponsor  downline
---------------------
3        3
5        1

有 2 个问题: - 名称不是权利,也不是我想要的 - 示例中的计数 0 "2|John|0" 不出现

谢谢你的建议和帮助,对不起英语,N。

4

1 回答 1

3
SELECT  child.id,
        child.name,
        COUNT(grandchild.sponsor) downline
FROM    TableName child
        INNER JOIN TableName parent
            ON  child.sponsor = parent.id AND
                parent.id = ?              -- << user choice
        LEFT JOIN TableName grandchild
            ON child.id = grandchild.sponsor
GROUP   BY child.id, child.name

如您所见,该表与自身连接了两次。使用的第一个联接获取与您的user_choiceINNER JOIN关联的记录。使用的第二个联接从您的user_choice获取与记录关联的所有记录。SponsorLEFT JOIN

于 2013-10-04T16:59:42.363 回答