【问题标题】:Conditions check in WHERE clauseWHERE 子句中的条件检查
【发布时间】:2013-02-20 01:40:39
【问题描述】:

我正在尝试构建一个查询,到目前为止这是它的WHERE 子句:

WHERE ( s.subject_name LIKE '%$keyword%' OR
        c.city_name LIKE '%$keyword%' OR
        o.option_name LIKE '%$option%' OR
        d.district_id = $districtId OR
        c.city_id = $cityId
       )

我的实际情况是:

  • $keyword 应该始终保存一个值。其他 3 个可能没有。
  • 如果只有$keyword 有值,返回的记录应该匹配 $keywordsubject_namecity_name
  • 如果$optional 有一个值,那么返回的记录应该匹配$keyword$option
  • 如果$districtId有一个值,那么结果应该匹配3个变量值($keyword$option$districtId
  • 最后,如果$cityId 与其他 3 个有一个值,返回的结果应该匹配所有 4 个变量的值。

这些条件来自我的搜索页面。 $keyword 是文本框中的值,需要关键字才能开始搜索。这就是为什么我说它总是有价值的。其他 3 个值来自允许在需要时选择项目的选择框。

我尝试进行查询,没问题。但我真的对WHERE 子句感到困惑。以上代码来自我的WHERE 子句。但我无法得到我想要的结果。

【问题讨论】:

  • 期望的结果是什么,你得到了什么?
  • 如果五个中至少有一个匹配,则输出
  • @PreetSangha 我在发布之前检查了该链接。但我不能将其应用于此。

标签: php mysql where-clause


【解决方案1】:

如果您想在纯 SQL 中实现这一点,这就是您所需要的(或者至少应该足够接近):

WHERE (
    ( s.subject_name LIKE '%$keyword%' OR c.city_name LIKE '%$keyword%' )
    AND ('$option' = '' OR (
        o.option_name LIKE '%$option%' AND (
            '$districtId' = '' OR (
                d.district_id = $districtId AND (
                    '$cityId' = '' OR c.city_id = $cityId
                )
            )
        )
    )
)

但是,这远远不是最理想的。相反,您应该检查 PHP 中用户输入的内容,并根据该输入运行不同的查询。您还可以动态构建查询:

$query = "SELECT ...";

$query .=
    " WHERE ( ( s.subject_name LIKE '%$keyword%' OR c.city_name LIKE %$keyword%' )";
if ( !empty($option) ) {
    $query .= " AND o.option_name LIKE '%$option%'";
    if ( !empty($districtId) ) {
        $query .= " AND d.district_id = $districtId";
            if ( !empty($cityId) ) {
                $query .= " AND c.city_id = $cityId";
            }
    }
}
$query .= ')';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多