Как объединить / построить дополнительные запросы? (PHP / MySQL)

0

Я создаю функциональность фильтра и задаюсь вопросом, как наилучшим образом объединить дополнительные запросы вместе. Например:

$basicquery = "SELECT * FROM products";

$filter1 = mysqli_real_escape_string($connection, $_GET['filter1']);
// has_presence is my function that returns false if value is NULL or ""
$optional1 = (has_presence($filter1)) ? "feature1='{$filter1}'" : "";
$filter2 = mysqli_real_escape_string($connection, $_GET['filter2']);
$optional2 = (has_presence($filter2)) ? "feature2='{$filter2}'" : "";
$filter3 = mysqli_real_escape_string($connection, $_GET['filter3']);
$optional3 = (has_presence($filter3)) ? "feature2='{$filter3}'" : "";

// How to build this one correctly?
$allqueries = $basicquery . 
              " WHERE " .
              $optional1 . 
              " AND " . $optional2 . 
              " AND " . $optional3;

Моя проблема заключается в создании $allquery при $allquery размещении WHERE и AND, потому что иногда мне даже не нужно WHERE, а иногда мне просто нужно 1 AND.

Это правильный способ создания такого запроса? (например, когда условие не указано, верните все для этого столбца). Или другой подход лучше (например, 3 отдельных запроса и присоединиться к ним)

Теги:

3 ответа

1
Лучший ответ

Одним из моих любимых подходов к этой проблеме является использование "нулевых" значений. Я просто передаю все параметры в окончательный запрос, но сначала проверяю, являются ли они нулевыми. Например, если у вас есть 3 фильтра, как в вашем примере, предложение where будет выглядеть примерно так:

where (filter1 is null or column1 = filter1)
and (filter2 is null or column2 = filter2)
and (filter3 is null or column3 = filter3)

Таким образом, у вас есть 3 основных преимущества:

  1. Вы можете добавить как фильтры, как пожелаете, и вам не нужно беспокоиться о их перестановках
  2. Производительность не влияет, поскольку, если один из фильтров имеет значение null, проверка не требует времени для выполнения
  3. Если база данных кэширует запрос, вы не потеряете это преимущество, потому что запрос всегда один и тот же, вы не перестраиваете его каждый раз в качестве конкатенации строк.
1
$query = "SELECT * FROM products";

$filter1 = mysqli_real_escape_string($connection, $_GET['filter1']);
$filter2 = mysqli_real_escape_string($connection, $_GET['filter2']);
$filter3 = mysqli_real_escape_string($connection, $_GET['filter3']);
if(has_presence($filter1) || has_presence($filter2) || has_presence($filter3) {
    $query .= " WHERE";
    $query .= (has_presence($filter1)) ? " feature1='{$filter1}'" : "";
    $query .= (has_presence($filter2)) ? " AND feature2='{$filter2}'" : "";
    $query .= (has_presence($filter3)) ? " AND feature2='{$filter3}'" : "";
}
0

Добавьте 1=1 и поместите AND перед каждым фильтром.

$basicquery = "SELECT * FROM products";

$filter1 = mysqli_real_escape_string($connection, $_GET['filter1']);
// has_presence is my function that returns false if value is NULL or ""
$optional1 = (has_presence($filter1)) ? " AND feature1='{$filter1}'" : "";
$filter2 = mysqli_real_escape_string($connection, $_GET['filter2']);
$optional2 = (has_presence($filter2)) ? " AND feature2='{$filter2}'" : "";
$filter3 = mysqli_real_escape_string($connection, $_GET['filter3']);
$optional3 = (has_presence($filter3)) ? " AND feature2='{$filter3}'" : "";

// How to build this one correctly?
$allqueries = $basicquery . 
              " WHERE 1=1 " .
              $optional1 . 
              $optional2 . 
              $optional3;
  • 1
    Вам это нужно для первого AND

Ещё вопросы

Сообщество Overcoder
Наверх
Меню