我有一个充满动物信息的数据库表,其中“ 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条件下使用父母?我认为情况是一样的。