我正在开发一个专注于动物的网站,并且一直在努力弄清楚如何显示一个分类的孙子,曾孙子等的数量。
这个脚本似乎可以很好地显示孩子的数量,除了它显示无意义的数字,如物种13,应该有0个孩子。
$stm = $pdo->prepare("SELECT Ch2.Taxon, COUNT(*) - 0 Children
FROM gz_life_mammals Ch
LEFT OUTER JOIN gz_life_mammals Ch2 on Ch.Taxon = Ch2.Taxon
WHERE Ch2.Parent = :MyURL
GROUP BY Ch.Parent");
$stm->execute(array(
'MyURL'=>$MyURL,
));
while ($row = $stm->fetch())
{
$ChildrenCount = $row['Children'];
}
echo $ChildrenCount;
我还没有能够显示正确数量的大孩子;结果非常不规律。
所以我想出了另一个方案。以下是我的数据库表中的一些数据,以父子关系排列。
**Taxon | Parent | Rank**
Mammalia | Chordata | 25
Carnivora | Mammalia | 35
Canidae | Carnivora | 45
Canis | Canidae | 55
Canis-lupus | canis | 65
假设我导航到MySite / life / carnivora页面,我想知道该顺序中有多少种。这意味着我必须确定有多少伟大的盛大嘉年华。
如果我不能用传统的方式做,那么也许我可以让它倒退。我只是编写一个查询,计算字段Rank的值为' 65'其伟大的祖父母是食肉目。'
现在有人怎么写这样的查询?
答案 0 :(得分:1)
我认为您的问题可能会受益于递归查询。在MySql中显然不可能,所以我找了一个解决方法。所以:基本上从this Q/A获取角色的角色。链接到那里from this。通过大型搜索引擎发现。
我对发布这个答案犹豫不决,因为我不完全确定这里发生了什么。 (例如,我不知道第一个链接帖子中提到的"危险"在你的情况下是否重要。你绝对希望成为在现场系统上使用它之前要小心< / CMA>
此查询返回后代数:MyUrl具有。
SELECT COUNT(@id := (
SELECT `taxon`
FROM gz_life_mammals
WHERE `parent` = @id
)) AS numDescendants
FROM (
SELECT @id := :MyUrl
) vars
STRAIGHT_JOIN gz_life_mammals
WHERE @id IS NOT NULL;
有趣的是,如果您从COUNT()
周围移除@id := (SELECT ...
,则会获得所有后代加上一个NULL
行的列表。