我想显示一个类似于此的状态鸟的分类列表:
订购Falconiformes
家庭隼科
游隼( Falco Perergrinus )|爱达荷州
订购Passeriformes
家庭鸫科
罗宾( 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中显示与鸟类相关的所有内容。我想只展示美国州鸟及其祖父母(家庭)和曾祖父母(订单)。
如果我修改WHERE子句以指示地理父级,就像这样......
WHERE PLAN.Group1 = 'bird' AND Rank != '55' **AND GG.IDParent = 'usa'**
然后它适用于物种(等级65)。但是,根本没有家庭或订单显示,大概是因为家庭和订单没有链接到表格gs或gw_geog。
所以我想知道是否有办法编写条件WHERE CLAUSE,就像这样...
WHERE PLAN.Group1 = 'bird' AND Rank != '55' [AND **- if Rank = 65 -** GG.IDParent = 'usa']
如果我可以这样做,那么表格仍应显示表格中的每个订单和系列,但我可以将一些PHP开关放在一起,手动删除我不想显示的订单和系列。
无论如何,现在有人如何修改那样的where子句?如果没有,你能建议另一种解决方法吗?
答案 0 :(得分:1)
重新定位谓词
GG.IDParent = 'usa'
从WHERE
子句到ON
的{{1}}子句
在WHERE子句中,该谓词否定了&#34;外部性&#34; LEFT JOIN。任何没有&#34;匹配&#34;的行来自LEFT JOIN
的行,所有GG
列都将为NULL,并且这些行不会满足GG.
子句中的该谓词。
WHERE