MySQL onde a cláusula é igual a qualquer coisa (SELECT * WHERE col = ANY_VALUE)

Gostaria de criar uma consulta no MySQL que tenha um valor opcional. Quando o valor é especificado, a consulta é filtrada por esse valor, quando o valor não é todas as linhas são retornadas. Aqui está a ideia:

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' 

Existe uma maneira fácil de fazer isso sem criar duas cadeias de consulta dependendo do valor de $ item?

Tanto quanto eu sei, não existe esse “espaço” de espaço reservado.

Se você pode usar LIKE, você poderia fazer

 SELECT * FROM table WHERE item LIKE '%' 

se você pode append uma condição, você poderia anular a cláusula de item como esta:

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

(não funciona no seu exemplo, pois você está passando “item” como um parâmetro)

São todas as opções que posso ver – provavelmente é mais fácil trabalhar com duas consultas, removendo completamente a cláusula WHERE no segundo.

Isso provavelmente funcionaria, mas não tenho certeza se é uma boa idéia do ponto de vista do database.

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

Uma melhor maneira de fazer isso é primeiro gerar consulta sql do parâmetro que você precisa para se preocupar e, em seguida, executar.

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

Realmente não há nenhum motivo para fazer isso com uma consulta. A execução da consulta sem nenhuma cláusula WHERE torna explícito que você deseja retornar todas as linhas. Executá-lo com uma cláusula WHERE torna explícito que você deseja filtrar as linhas.