繁体   English   中英

从缺少某些WHERE条件的表中选择

[英]Select from table where some WHERE condition missing

我有以下SQL请求

        if(isset($_GET['room'])) {

            if($_GET['status'] == 'all' && $_GET['room'] == 'all'){
                $stmt = $pdo->prepare("SELECT DISTINCT flatnetto FROM flat ORDER BY flatnetto");
                $stmt->execute(array($_GET['room'], $_GET['status']));
            }else if($_GET['status'] == 'all'){
                $stmt = $pdo->prepare("SELECT DISTINCT flatnetto FROM flat WHERE kk = ? ORDER BY flatnetto");
                $stmt->execute(array($_GET['room']));
            }else if($_GET['room'] == 'all'){
                $stmt = $pdo->prepare("SELECT DISTINCT flatnetto FROM flat WHERE sold = ? ORDER BY flatnetto");
                $stmt->execute(array($_GET['status']));
            }else{
                $stmt = $pdo->prepare("SELECT DISTINCT flatnetto FROM flat WHERE kk = ? AND sold = ? ORDER BY flatnetto");
                $stmt->execute(array($_GET['room'], $_GET['status']));
            }               

            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        }

可以从上面的代码中仅发出一个sql请求吗? 我的意思是,可以只提出一个请求

    $stmt = $pdo->prepare("SELECT DISTINCT flatnetto FROM flat WHERE kk = ? AND sold = ? ORDER BY flatnetto");

但条件“ kk”和“出售”可能存在或可能不存在(将具有无法分类的“全部”值)。 因此,例如,如果“ kk”不存在,则将其忽略,然后仅在条件为“卖出”的情况下继续选择。

上面的代码可以正常工作,但是定义所有可能的选项很烦人。


状态可以有值(已售,保留,全部)

房间可以有值(1kk,2kk,3kk,全部)

值“全部”意味着,例如,我在2kk会议室很有趣,无论是“出售”还是“保留”,都只向我展示它们。

更新的问题。

正如在下面的答案中所写,可以发出一个sql请求。 但是问题仍然存在,因为我们只是将“可能的选项定义”移至sql查询,但是我仍然必须定义所有可能的选项。 我无法想象如何定义所有可能的选项,如果我们不仅有两个输入,而且例如“房间,状态,price1,price2,地板,大小...”,并且它们都可以具有自己的价值,但还价值“全部” ”。 在这种情况下,我们必须从所有可能的变化中定义所有可能的选项(在这种情况下,超过20个可能的变化)。 我认为这在大型项目中是行不通的。

考虑所有可能性的联合查询。 根据选择参数,将仅输出一行查询:

$stmt = $pdo->prepare("SELECT DISTINCT flatnetto FROM flat WHERE kk = :kk 
AND sold = :sold AND NOT kk = 'all' AND NOT sold = 'all ORDER BY flatnetto
UNION SELECT DISTINCT flatnetto FROM flat WHERE kk = 'all' AND sold = :sold
ORDER BY flatnetto
UNION SELECT DISTINCT flatnetto FROM flat WHERE kk = :kk AND sold = 'all'
ORDER BY flatnetto
UNION SELECT DISTINCT flatnetto FROM flat WHERE kk = 'all' AND sold = 'all' 
ORDER BY flatnetto");
$stmt->execute(array(':kk' => $_GET['room'], ':sold' => $_GET['status']));

您可以使用以下代码来生成您的SQL查询

$param=Array();

## associate query parameters to sql column
$keys=Array("room" => "kk", "status" => "sold");

## generate parameter list
foreach ($keys as $k=>$v)
if (isset($_GET[$k])&&($_GET[$k]!='all'))
   $param[$v]=$_GET[$k];

## generate query
$query="SELECT DISTINCT flatnetto FROM flat WHERE ".
    implode(" = ? AND ", array_keys($param)).
    (count($param) ? " = ?" : "1")
    ." ORDER BY flatnetto";

## execute
$stmt = $pdo->prepare($query);
$stmt->execute($param);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM