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

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


这是我的查询的简化示例(其中$ MyURL =页面的URL,例如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'];
}


因此,我可以轻松地显示分类单元的父母。我还想出了如何展示祖父母和孩子的方法。谁能告诉我如何显示一个分类单元的姊妹组(也许是其父母的姊妹组)的数量?

例如,我认为熊科有7种。因此,如果我要访问他们的网页之一(MySite / life / ursus-maritimus),我想要一个脚本,说北极熊有6个姊妹类群(或者是7个类群之一)。

知道如何确定其父母(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'];
}

最佳答案

您可以使用以下方法计算每个分类单元具有的兄弟姐妹数:

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条件下使用父母?我认为情况是一样的。

10-05 19:44