mysql select in another select group:下线有多少人?

Posted

技术标签:

【中文标题】mysql select in another select group:下线有多少人?【英文标题】:mysql select in another select group: how many people in downline? 【发布时间】:2013-10-11 17:55:55 【问题描述】:

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

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,我会尝试这个“糟糕的解决方案”

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

这个查询的结果是

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

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

感谢您的建议和帮助,英语很抱歉, N.

【问题讨论】:

你应该使用左外连接来做到这一点 【参考方案1】:
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
SQLFiddle Demo

如您所见,该表与自身连接了两次。第一个使用INNER JOIN 的连接获取与Sponsor 关联的记录,这是您的user_choice。使用LEFT JOIN 的第二个联接从您的user_choice 中获取与记​​录关联的所有记录。

【讨论】:

天哪,你真是个天才!伟大的!其作品! 10Q 用户 #491243 :)) 我很高兴 tnx 再次

以上是关于mysql select in another select group:下线有多少人?的主要内容,如果未能解决你的问题,请参考以下文章

Zuora's IPO is another step in golden age of enterprise SaaS

在mysql 中 < in_optimizer >是干啥的?怎么用?

Mysql IN语句查询

mysql not in 丢失数据

Mysql常用查询

CF1073G Yet Another LCP Problem 后缀自动机 + 虚树 + 树形DP