Подтвердить что ты не робот

MySQL где предложение равно чему угодно (SELECT * WHERE col = ANY_VALUE)

Я хотел бы создать запрос в MySQL, который имеет необязательное значение. Когда значение указано, запрос фильтруется этим значением, когда возвращается не все строки. Здесь идея:

public function doQuery($item = 'ANY_VALUE') {
  $query = "SELECT * FROM table WHERE item = ?";
  db->fetchAll($query,array($item))
  ...
}

doQuery(); // Returns everything
doQuery($item='item1'); // Returns only rows where item = 'item1'

Есть ли простой способ сделать это, не создавая две строки запроса в зависимости от значения $item?

4b9b3361

Ответ 1

Насколько я знаю, такого "никакого" заполнителя нет.

Если вы можете использовать LIKE, вы можете сделать

SELECT * FROM table WHERE item LIKE '%'

если вы можете добавить условие, вы можете аннулировать предложение item следующим образом:

SELECT * FROM table WHERE item = ? OR 1=1

(не будет работать в вашем примере, потому что вы передаете "элемент" в качестве параметра)

Что все параметры, которые я вижу, - это, пожалуй, проще всего работать с двумя запросами, вообще говоря, в статье WHERE во втором.

Возможно, это сработает, но я не уверен, хорошая ли это идея с точки зрения базы данных.

public function doQuery($item = 'ANY_VALUE') {
  $query = "SELECT * FROM table WHERE item = ? OR 1 = ?";
  db->fetchAll($query,array($item, ($item == 'ANY_VALUE' ? 1 : 0))
  ...
}

Ответ 2

Лучший способ сделать это - сначала сгенерировать sql-запрос из параметра, который вам нужно беспокоить, а затем выполнить.

function doQuery($params) {
    $query = 'SELECT * FROM mytable ';
    if (is_array($params) // or whatever your condition ) { 
        $query .= 'WHERE item = ' . $params[0];
    }
    $query .= ' ;';

    // execute generated query
    execute($query);
}

Ответ 3

На самом деле нет причин делать это с помощью одного запроса. Запуск запроса без предложения WHERE делает его явным, что вы хотите вернуть все строки. Запуск его с предложением WHERE делает его явным, что вы хотите фильтровать строки.