Выберите из таблицы, где отсутствует условие WHERE

У меня есть следующий запрос 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» не существует, просто проигнорируйте его и продолжайте выбирать только с условием «продано».

Приведенный выше код работает, но довольно сложно определить все возможные варианты.


Статус может иметь значения (Продано, Зарезервировано, Все)

Комната может иметь значения (1кк, 2кк, 3кк, все)

Значение «все» означает, что, например, мне интересно на 2кк комнате, и неважно, «продан» или «зарезервирован», просто покажи мне все из них.

ОБНОВЛЕННЫЙ Вопрос.

Как написано в ответе ниже, можно сделать один sql запрос. Но проблема остается, потому что мы просто перемещаем «определение возможного варианта» в SQL-запрос, но мне все еще нужно определить все возможные варианты. Я не могу себе представить, как определить все возможные варианты, если у нас будет не только два ввода, например, «комната, статус, цена1, цена2, этаж, размер …», и все они могут иметь собственную ценность, но также иметь значение «все» ». В этом случае мы должны определить все возможные варианты из всех возможных вариантов (в этом случае более 20 возможных вариантов). Я думаю, что это не так, как это работает в больших проектах.

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);
0

Другие решения

Считайте объединительный запрос исчерпывающим для всех возможностей. В зависимости от параметров выбора будет выводиться только одна строка запроса:

$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']));
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector