2014-08-31 38 views
0

我想显示状态鸟类的分类列表看起来是这样的:条件Where子句(根据等级)

订购隼
家庭食肉鸟
游隼(法尔科Perergrinus)|爱达荷州
订单雀
家庭Turdidae
罗宾(鸫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">&gt; <em>Family</em> <b>'.$Family.'</b> ('.$Common.')</td></tr>'; 
break; 
case 65: 
$SymRow = ' 
<tr> 
<td class="Symbol">&gt;&gt; <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子句,这样的事情...

WHERE PLAN.Group1 = 'bird' AND Rank != '55' [AND **- if Rank = 65 -** GG.IDParent = 'usa'] 

如果我能做到这一点,那么该表应仍显示每一笔订单和家庭,但我可以将一些PHP开关放在一起,手动删除我不想显示的订单和家庭。

无论如何,现在没有人如何修改这样的where子句吗?如果没有,你能否提出另一种解决方法?

回答

1

WHERE子句重新定位谓词

GG.IDParent = 'usa' 

到的LEFT JOIN

ON的子句中的WHERE子句,该谓词否定的LEFT的 “outerness” JOIN。从GG没有任何“匹配”行的任何行,所有GG.列都将为NULL,并且这些行将不会满足WHERE子句中的该谓词。

LEFT JOIN gw_geog GG ON GG.IDArea = GS.IDArea AND GG.IDParent = 'usa' 
               ^^^^^^^^^^^^^^^^^^^^^^^ 
+0

有趣。目前它不工作;它仍然显示表格gs_planimals中的所有鸟类分类。我认为这个问题可能与GROUP条款有关,但我在那里没有任何运气。如果我完全删除GROUP BY PLAN.Common,则什么都不显示。无论如何,我认为你给了我正确的答案,但我只需要稍微玩一下我的查询来弄清楚发生了什么。谢谢! – 2014-08-31 18:16:13

+0

我给出的答案解释了如何返回没有与GG匹配的行的行。在WHERE子句中使用该谓词,您将只获得具有匹配的GG行的行。我不理解你想要返回的一组行的要求。 – spencer7593 2014-08-31 18:27:19

+0

如果我想显示美国国家鸟类列表,那么我只想显示与1)鸟类和2)美国状态相关的行。这在物种层面上很容易实现(等级= 65),因为物种在GS表中列出,每一行都与表gw_geog链接。但是,家庭和订单只列在平面图中,我不知道如何将它们与其他表格相关联。然而,我刚想出了一个解决方法... – 2014-08-31 18:30:38