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?
Ответы
Ответ 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 делает его явным, что вы хотите фильтровать строки.