2014-08-31 37 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