我有一个充满动物信息的数据库表,其中“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'];
}
答案 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'])
会给你一个数组,以便于计算/迭代/无论如何。