如何应用具有多个值和条件的高级搜索查询

时间:2018-06-20 11:45:07

标签: mysql

我有一个视图,用户可以在其中选择要进行高级搜索的字段,这些字段是:

**name**- **age** - **location** - **isPaid** - **date_subscription**, **date_expiration** 

用户可能选择一个列或将多个列组合在一起,如果我应该使用if statement来检测选择了哪些列,然后根据所选择的列来运行查询,我会感到困惑,但是我这样做将需要设置所有有效条件,这意味着设置所有有效组合。还有其他执行此类查询的方法吗?

我正在编写此查询,但是我停了下来,因为我只是意识到会持续多长时间:

SELECT * FROM internetclientdetails icd INNER JOIN internetclient ic on ic.id = icd.icid WHERE
                        (icd.date_sub <=".$start_dateSubsc." and cd.date_sub >= ".$end_dateSubsc.")
                        OR
                        (icd.date_exp <=".$start_dateExp." and cd.date_exp >= ".$end_dateExp.")
                        OR
                        (
                            (icd.date_sub <=".$start_dateSubsc." and cd.date_sub >= ".$end_dateSubsc.")
                            AND 
                            (icd.date_exp <=".$start_dateExp." and cd.date_exp >= ".$end_dateExp.")
                        )
                        OR 
                        .
                        .
                        .

但是这太长了,因为我还有4个左字段来设置ORAND运算符

1 个答案:

答案 0 :(得分:1)

通常,您会添加一些已经查询的构建库,该库可以从您选择的输入中构建有效的SQL。

其中有许多,例如Doctrine DB abstraction layerMedoo和其他一些

例如,在Medoo中,一个相当复杂的查询,例如:

SELECT account,user_name FROM table 
WHERE user_id IN (2,123,234,54) OR 
email IN ('foo@bar.com','cat@dog.com','admin@medoo.in')

将用PHP编写为:

$database->select("account", "user_name", [
    "OR" => [
        "user_id" => [2, 123, 234, 54],
        "email" => ["foo@bar.com", "cat@dog.com", "admin@medoo.in"]
    ]
]);

因此,使用medoo时要做的就是从表单传递正确的输入。

关于您有关用户如何选择不同列的问题,您可以使用以下内容:

$ mapping = array(“ start_dateSubsc” =>“ date_sub”,“ end_dateSubsc” =>“ date_sub”,...);

在其中列出用户可以在网页中输入的所有可能字段,这些字段都映射到实际数据库表的列名。

然后,当您处理页面时,您将执行以下操作:

$wherequery["OR"]=array();
foreach ($mapping as $userfield => $dbfield)
{
    if array_key_exists($userfield, $_REQUEST)
        array_push($wherequery["OR"], $dbfield => $_REQUEST[$userfield]);
}
$database->select("your columns"),[ $wherequery ]);

这将适用于需要=用户所说的字段以及您必须在其中匹配任何字段的字段。

与可能在范围内的字段有更多关系,然后分别处理它们,以及使用“ AND”处理字段,但这取决于实际字段的范围和可能性。