2010-05-20 16 views
10

vistazo a esta tabla por favorseleccionar ... donde id = cualquier valor. ¿Es posible?

table 
|id| |name| |order| 

debo obtener las filas, donde name = something y order = somevalue

así escribo

select `id` from `table` where `name` = 'something' and `order` = 'somevalue' 

sino que dependen de la lógica php, a veces necesito para obtener toda filas, donde name = something, independientemente del valor order. No quiero cambiar la estructura de la consulta, porque en la práctica hay muchos campos y el número posible de consultas será muy grande. así que quiero Guardar la estructura de consulta, y cuando necesito para seleccionar sólo por su nombre, quiero escribir algo como esto:

select `id` from `table` where `name` = 'something' and `order` = any value 

es posible?

gracias

+1

que cambiaría la forma en que está construyendo sus consultas ... – nickf

Respuesta

10

Bueno, es una especie de truco, pero si realmente necesita hacer esto, que va a trabajar de esta manera:

select `id` from `table` where `name` = 'something' and `order` = `order` 

Entonces estás diciendo "allí donde el orden es lo mismo que a sí mismo ", por lo que siempre es cierto.

+2

Me parece que es el cambio de la estructura, ya que la sintaxis para referirse a un campo que no es el mismo que para referirse a una cadena. –

+0

Esta no es la forma correcta de hacerlo. El código php necesita ser ajustado. – vonPetrushev

5

No, esto no es posible. Necesita cambiar la estructura (opcionalmente a LIKE para que pueda usar '%', pero eso es muy feo).

Sin embargo, no necesita escribir una consulta diferente para manejar todas las combinaciones posibles. Simplemente puede crear la consulta de forma dinámica:

//create base query 
$query = "select `id` from `table` where `name` = 'something' "; 

//add order if we need it 
if ($use_order) 
    $query .= "and `order` = 'somevalue' "; 

//repeat for any other optional part 

Tenga en cuenta que usted debe, por supuesto, aún adoptar medidas adecuadas para evitar la inyección de SQL y otros problemas de seguridad - No he incluido esta aquí con el fin de mantener las cosas simples.

+0

¿Qué es la inyección SQL? ¿quizás hablas de mysql_real_escape_string() y de tales funciones? No entiendo el significado de "inyección SQL" – Simon

+0

@Syom: la inyección SQL es el acto de proporcionar datos que afectan la estructura de la consulta, haciendo que haga algo más de lo que se suponía que debía hacer. mysql (i) _real_escape_string es de hecho lo que la mayoría de la gente usa para evitar eso (aunque las consultas parametrizadas son estrictamente un mejor enfoque, pero ese es un tema diferente). Si desea saber más, hay muchos recursos buenos, tanto en SO como disponibles a través de Google. Todo lo que trato de decir es que todavía necesita recordar hacer este tipo de cosas al construir dinámicamente. –

2

Si está utilizando parámetros vinculados, sería imposible.

Si acaba de sustituir los valores, puede hacer lo siguiente:

select `id` from `table` where `name` = 'something' and `order` = `order` 
0

No creo que haya ninguna elección ... Una vez hecho una selección no se puede "eliminar el filtro" y obtener más filas

Solo debe usar dos consultas: dos consultas independientes, o una que seleccione sobre el nombre en una tabla temporal, y luego (opcionalmente) una que seleccione más en el atributo de orden.

0

Como dijo Chad anteriormente, simplemente configure la columna igual a ella. Pero tenga cuidado, en algunas plataformas/instalar configuraciones, NULL = NULL:

select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'') 
+4

NULL! = NULL es en realidad el comportamiento esperado, como se define en el estándar SQL. –

0

Este es un tema común con las consultas de bases de datos - que necesita una consulta variable en función de la cantidad de filtrado que desea aplicar a los datos que! consultas. Podría seguir la ruta de repetir su consulta como una cadena a lo largo de su código, pero eso es una mala práctica ya que aumenta la complejidad del código innecesariamente. Las posibilidades de errores ocurren si necesita cambiar la consulta por algún motivo, y tiene que cambiarla en varios lugares como resultado.

La mejor solución es crear una función que se basa la consulta para ejecutar:

function buildMyQuery($name, $order = null) { 
    $sql = "SELECT `id` FROM `table` WHERE `name`='$name'"; 

    if ($order != null) { 
     $sql .= " AND `order`='$order'"; 
    } 

    return $sql; 
} 

A continuación, puede ejecutar esto por sólo utilizando el campo 'nombre':

$query = buildMyQuery("somename"); 

O esto para usar ambos campos:

$query = buildMyQuery("somename", "someorder"); 

Como alguien mencionó anteriormente, este código es deliberadamente simp lified y no contiene contingencia para datos posiblemente peligrosos pasados ​​a través de $ name o $ order. Debería usar mysql_real_escape_string o algo similar para limpiar los datos primero, al comienzo de la función antes de que se use cualquiera de los datos.

La generación de consultas dinámicas es una realidad como dice Byron, por lo que me acostumbraría a ella ahora en lugar de utilizar soluciones temporales de hack-ish.

0

En la reflexión, tengo una mejor respuesta. Mi colega me mostró una forma de hacerlo.

Mi ejemplo ...

Select rentals.* From rentals Where ((? = '') OR (user_id = ?)) 

Las variables deben ser los mismos.

Si ambos son 5, por ejemplo, la primera booleano serán falsos, pero el segundo será cierto, por las filas en las que los usuarios id sea 5.

Si necesita "todo", estableciendo como una cadena vacía dará como resultado que se vea que todas las filas cumplen la condición cláusula where.

0

¿No puede simplemente usar una consulta not null aquí?

select `id` from `table` where `name` = 'something' and `order` is not null; 
Cuestiones relacionadas