我想显示州鸟的分类列表,如下所示:
隼形目
隼科
游隼 (Falco Perergrinus) |爱达荷州
雀形目
鸫科
知更鸟 (Turdus migratorius) |康涅狄格州、密歇根州、威斯康星州
我不知道如何进行一个查询来完成我想要的任务,因此我正在尝试找出解决方法。
这是我的基本查询:
$stm = $pdo->prepare("SELECT PLAN.Latin Latin2, PLAN.Common, PLAN.Group1, PLAN.Rank, PLAN.Family, PLAN.Order1, GS.Symbol, GS.Latin, GROUP_CONCAT(GG.Name ORDER BY GG.Name ASC SEPARATOR ', ') as Names, GG.IDParent
FROM gs_planimals PLAN
LEFT JOIN gs GS ON GS.Latin = PLAN.Latin
LEFT JOIN gw_geog GG ON GG.IDArea = GS.IDArea
WHERE PLAN.Group1 = :RefCat AND Rank != '55'
GROUP BY PLAN.Common
ORDER BY PLAN.N, GG.Name");
$stm->execute(array(
'RefCat'=>$RefCat,
));
然后我可以用它来设置行的样式...
switch($Rank)
{
case 35:
$SymRow = '<tr class="Red Center"><td colspan="2" style="border-bottom: 1px solid #fff;"> <em>Order</em> <b>'.$Order.'</b> ('.$Common.')</td></tr>';
break;
case 45:
$SymRow = '<tr class="Blue"><td colspan="2">> <em>Family</em> <b>'.$Family.'</b> ('.$Common.')</td></tr>';
break;
case 65:
$SymRow = '
<tr>
<td class="Symbol">>> <a href="'.$GZ_URL.'/life/'.$LatinL.'" title="'.$Symbol.' ('.$Latin2.')">'.$row['Common'].'</a> (<em>'.$Latin2.'</em>)</td>
<td class="Place"><a href="/world/'.$PlaceL.'" title="'.$Place.'">'.$PlaceGroup.'</a> </td>
</tr>
';
break;
default:
$SymRow = '';
break;
}
...其中等级 35 = 目,45 = 科,65 = 物种。这可行,但它显示了表 gs_planimals 中与鸟类相关的所有内容。我只想显示美国州鸟及其祖 parent (科)和曾祖 parent (目)。
如果我修改 WHERE 子句以指示地理父级,如下所示...
WHERE PLAN.Group1 = 'bird' AND Rank != '55' **AND GG.IDParent = 'usa'**
然后它适用于物种(排名 65)。但是,根本不显示族或订单,可能是因为族和订单未链接到表 gs 或 gw_geog。
所以我想知道是否有办法编写条件 WHERE 子句,像这样......
WHERE PLAN.Group1 = 'bird' AND Rank != '55' [AND **- if Rank = 65 -** GG.IDParent = 'usa']
如果我能做到这一点,那么表格仍然应该显示表格中的每个订单和系列,但我可以组合一些 PHP 开关来手动删除我不想显示的订单和系列。
无论如何,现在有人如何修改这样的 where 子句吗?如果没有,您能建议另一种解决方法吗?
最佳答案
重新定位谓词
GG.IDParent = 'usa'
从WHERE
子句到LEFT JOIN
的ON
子句
在 WHERE 子句中,该谓词否定 LEFT JOIN 的“外部性”。任何没有来自 GG
的“匹配”行的行,所有 GG.
列都将为 NULL,并且这些行不会满足WHERE
子句。
LEFT JOIN gw_geog GG ON GG.IDArea = GS.IDArea AND GG.IDParent = 'usa'
^^^^^^^^^^^^^^^^^^^^^^^
关于php - 条件Where子句(基于排名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594608/