在父子查询中计算兄弟姐妹

时间:2015-08-26 00:14:32

标签: php mysql

我有一个充满动物信息的数据库表,其中“Taxon”字段包含科学名称,“Parent”列出每个分类单元的父级。例如,北极熊的值看起来像这样,其中Ursus maritimus是北极熊的学名:

TAXON | PARENT
Mammalia | Vertebrata
Carnivora | Mammalia
Ursidae | Carnivora
Ursus | Ursidae
Ursus-maritimus | Ursus

这是我的查询的简化示例(其中$ MyURL =网页的网址,例如MySite / life / ursus-maritimus):

$stm = $pdo->prepare("SELECT L.Taxon, L.Parent
 FROM gz_life L
 WHERE L.Taxon = :MyURL");
$stm->execute(array(
 'MyURL'=>$MyURL,
));

while ($row = $stm->fetch())
{
 $Taxon = $row['Taxon'];
 $Parent = $row['Parent'];
}

所以我可以很容易地显示一个分类单位的父母。我也想出了如何展示祖父母和孩子。 有谁能告诉我如何显示分类单元的姐妹群体(也许是其父母的姐妹团体)的数量?

例如,我认为熊科中有七种。因此,如果我正在访问他们的一个页面(MySite / life / ursus-maritimus),我想要一个脚本,说北极熊有六个姐妹分类群(或者它是七个分类群之一)。

知道如何确定其父母(Ursus)是否是该家族中的唯一属(Ursidae)也很酷。或者,如果没有,该家族还有多少其他属?但是,如果这太复杂了,请忽略它,我稍后会解决这个问题。

现在,我想知道如何告诉我的网页北极熊是其家族中的七种物种之一,而土豚是该属中唯一的物种。

注意:我收到了两条很棒的建议,但是还没有人为我工作。我编辑了这篇文章来展示我的尝试。

解决方案#1

当我回应$ Sibling时,它显示“Ursus”而不是所有兄弟姐妹。

$stm = $pdo->prepare("select gp.Taxon Sibling, count(*) - 1
from gz_life g
inner join gz_life gp on g.Parent = gp.Parent
where gp.Taxon = 'Ursus'
group by g.Parent");
 $stm->execute(array(
 ));

while ($row = $stm->fetch())
{
 $Siblings = $row['Sibling'];
}

解决方案#2

当我回显$ Taxon2时,它显示“Ursus”而不是所有兄弟姐妹。

$stm = $pdo->prepare("SELECT L.Taxon, L.Parent, (SELECT COUNT(*)
FROM  gz_life AS cnt WHERE cnt.Parent = L.Taxon)
from gz_life L
  WHERE L.Taxon = 'Ursus'");
 $stm->execute(array(
  'MyURL'=>$MyURL,
 ));

while ($row = $stm->fetch())
{
 $Taxon2 = $row['Taxon'];
}

2 个答案:

答案 0 :(得分:1)

你可以计算每个分类单元的兄弟姐妹数量,用这个:

select gp.taxon, count(*) - 1 siblings
from gz_life g
inner join gz_life gp on g.parent = gp.parent
where gp.taxon = 'Ursus'
group by g.parent

此查询将仅显示一行,显示特定分类单元的父级下方的分类数。 - 1将排除有问题的分类单元,向您显示兄弟姐妹的数量。

演示于:http://sqlfiddle.com/#!9/91e35/4

关于第二部分,(为了确定其父母是否是该家族中唯一的属),我不确定我是否理解正确,但是你不能使用相同的技术,但这一次在where条件下使用父级?我认为情况相同。

答案 1 :(得分:1)

您可以在主要/原始查询中获取该属中的物种数量,但是为了在链中一直向上,我认为您在应用程序代码中需要一些递归逻辑。但是对于属中的物种,只需将子查询添加到第三列中:

SELECT L.Taxon, L.Parent, (SELECT GROUP_CONCAT(siblings.Taxon) FROM gz_life AS siblings WHERE siblings.Parent = gz_life.Parent AND siblings.Taxon != gz_life.Taxon) AS Siblings ...

然后$row['Siblings']将是兄弟姐妹的逗号分隔(字符串)列表。然后str_getcsv($row['Siblings'])会给你一个数组,以便于计算/迭代/无论如何。

相关问题