【问题标题】:Select from table where some WHERE condition missing从缺少某些 WHERE 条件的表中选择
【发布时间】:2015-05-16 15:43:21
【问题描述】:

我有以下 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”和“sold”可能存在也可能不存在(将具有不可排序的“all”值)。因此,例如,如果“kk”不存在,则忽略它并仅在条件“已售出”的情况下继续选择。

上面的代码可以运行,但是定义所有可能的选项很烦人。


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

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

价值“全部”意味着例如我对 2kk 房间很感兴趣,无论是“已售出”还是“保留”,都只显示给我。

更新的问题。

正如在下面的答案中所写,可以发出一个 sql 请求。但是问题仍然存在,因为我们只是将“可能的选项定义”移动到 sql 查询,但我仍然必须定义所有可能的选项。我无法想象如何定义所有可能的选项,如果我们不仅有两个输入,而且例如“房间、状态、价格 1、价格 2、楼层、大小......”并且它们都可以有自己的价值,但也可以价值“所有”。在这种情况下,我们必须从所有可能的变化中定义所有可能的选项(在这种情况下,超过 20 种可能的变化)。我认为这不是它在大型项目中的工作方式。

【问题讨论】:

  • 不,只要你有变量要定义,那个参数应该有绑定

标签: php mysql sql sorting conditional-statements


【解决方案1】:

您可以使用以下代码生成您的 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);

【讨论】:

  • 嗨,这似乎是一段很有用的代码。我会测试它并告诉你。
  • 绝对有效,我只需要更改 $stmt->execute($param);到 $stmt->execute(array_values($param));
【解决方案2】:

考虑对所有可能性进行详尽的联合查询。根据选择参数,只会输出一行查询:

$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 raquest。但请检查更新的问题。
猜你喜欢
  • 1970-01-01
  • 2020-01-16
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多