php - 条件Where子句(基于排名)

标签 php mysql

我想显示州鸟的分类列表,如下所示:

隼形目
隼科
游隼 (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">&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 中与鸟类相关的所有内容。我只想显示美国州鸟及其祖 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 JOINON子句

在 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/

相关文章:

php - 从数据库动态导航

php - C for 循环与 PHP for 循环不同吗?

php - 使用 REGEXP 重新查询 MYSQL 中的变量

mysql - 时间维度填充问题

php - 搜索 csv 列并插入到 mysql

java - 如何从 Java 运行 Windows 命令

php - 如何制作简单的动态幻灯片/游戏中时光倒流

php - 如何实现多个关键词的映射关键词匹配以及基于点击次数的偏好?

php - MySQL Date_Format 基于今天的日期和另一列?

mysql - 如何在 SQL 中显示 NULL 记录