Select 来自 table 缺少某些 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" 和 "sold" 可能存在也可能不存在(将具有无法排序的 "all" 值)。因此,例如,如果 "kk" 不存在,则忽略它并继续仅使用条件 "sold" 进行选择。
上面的代码可以工作,但是定义所有可能的选项非常烦人。
状态可以有值(已售出、保留、全部)
房间可以有值(1kk、2kk、3kk、全部)
Value "all" 表示例如我对 2kk 房间很感兴趣,无论是 "sold" 还是 "reserved" 都给我看。
更新问题。
正如下面的答案所写,可以提出一个 sql 请求。但问题仍然存在,因为我们只是将 "possible option definition" 移动到 sql 查询,但我仍然必须定义所有可能的选项。我无法想象如何定义所有可能的选项,如果我们不仅有两个输入,而且例如 "room, status ,price1, price2, floor, size ...",并且它们都可以有自己的值,但也可以有值 "all"。在这种情况下,我们必须从所有可能的变化(在这种情况下超过 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);
我有以下 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" 不存在,则忽略它并继续仅使用条件 "sold" 进行选择。
上面的代码可以工作,但是定义所有可能的选项非常烦人。
状态可以有值(已售出、保留、全部)
房间可以有值(1kk、2kk、3kk、全部)
Value "all" 表示例如我对 2kk 房间很感兴趣,无论是 "sold" 还是 "reserved" 都给我看。
更新问题。
正如下面的答案所写,可以提出一个 sql 请求。但问题仍然存在,因为我们只是将 "possible option definition" 移动到 sql 查询,但我仍然必须定义所有可能的选项。我无法想象如何定义所有可能的选项,如果我们不仅有两个输入,而且例如 "room, status ,price1, price2, floor, size ...",并且它们都可以有自己的值,但也可以有值 "all"。在这种情况下,我们必须从所有可能的变化(在这种情况下超过 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);