2010-08-07 12 views
17

me gustaría crear una consulta en MySQL que tiene un valor opcional. Cuando se especifica el valor, la consulta se filtra por ese valor, cuando el valor no es todas las filas se devuelven. Esta es la idea:MySQL cláusula where es igual a nada (SELECT * DONDE col = ANY_VALUE)

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' 

¿Hay una manera fácil de hacer esto sin crear dos cadenas de consulta en función del valor de $ artículo?

+0

Podría haber formulado usando PHP también. –

Respuesta

17

Por lo que yo sé, no existe tal "ninguna" marcador de posición.

Si puede utilizar como, usted podría hacer

SELECT * FROM table WHERE item LIKE '%' 

si se puede añadir una condición, que podría anular la cláusula item así:

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

(no funcionará en su ejemplo, porque está pasando "elemento" como parámetro)

Esas son todas las opciones que puedo ver, probablemente sea más fácil trabajar con dos consultas, eliminando el WHERE cláusula en total en el segundo.

Esto probablemente funcionaría, pero yo * No estoy seguro de si se trata de una buena idea desde el punto de vista de base de datos.

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

Ideas interesantes. La idea de la cláusula LIKE podría funcionar, pero creo que perjudicará el rendimiento. Agregar otra cláusula where requeriría la manipulación de cadena de la consulta que quería evitar. Si quisiera ir por esa ruta, ¿podría agregar el 'item =?' cláusula directamente a la cadena de consulta ... – user27478

+2

Extendiendo el segundo ejemplo: SELECCIONAR * FROM tabla WHERE item =? O 1 =? Ponga 0 en el segundo parámetro si desea filas específicas, o 1 si desea que todos – Mchl

+0

I * * piensan que MySQL cortocircuito una 'LIKE '%'' 'declaración en 1 = 1' ... Inténtelo (y dudo que afecte mucho el rendimiento, incluso si no es un cortocircuito, ya que necesitaría una exploración de tabla completa de todos modos) ... – ircmaxell

-1

Realmente no hay razón para hacer esto con una consulta. Ejecutar la consulta sin cláusula WHERE hace que sea explícito que desea devolver todas las filas. Al ejecutarlo con una cláusula WHERE, se hace explícito que desea filtrar las filas.

+1

La consulta en realidad que estoy ejecutando es mucho más complicada que el ejemplo que di. Siguiendo el principio DRY, no quiero tener que mantener dos copias de lo que es esencialmente la misma consulta (más o menos una cláusula where). – user27478

+1

Si te entiendo correctamente, puedes construir tu consulta en un solo lugar, ramificando solo si tu parámetro $ item tiene un valor. No consideraría una violación DRY. – mwittrock

+0

@gerdemb, si una consulta tiene una condición WHERE y otra no, de ninguna manera pueden considerarse 'esencialmente la misma consulta'.Es un gran error suponer que debido a que el texto de dos consultas diferentes es similar, la semántica de las dos consultas es similar. –

3

mejor manera de hacer esta primera se generará consulta SQL del parámetro que tiene que molestarse en, y luego ejecutar.

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