sql >> Base de Datos >  >> RDS >> Mysql

mysql, consulta con confirmación a donde, si el valor =cualquier cosa

Use corchetes en su consulta para agrupar los elementos de la cláusula WHERE de forma lógica.

WHERE name = 'abc' AND (value = 12 OR 1=1)

Si está tratando de proporcionar una consulta que acepte dos variables y busque en función de esas variables, solo está un poco equivocado en su lógica.

Con ambas variables proporcionadas

Suponiendo que tenemos dos variables @incoming_name y @incoming_value :

SET @incoming_name = 'abc';
SET @incoming_value = 12;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

Esto le dará

1        abc       12

Con una variable suministrada

Luego, si el usuario proporciona NULL para cualquiera de esos valores, los omitirá en su búsqueda.

SET @incoming_name = 'abc';
SET @incoming_value = NULL;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

Esto todavía te da el resultado esperado

1        abc       12

Sin variables proporcionadas

Si el usuario no proporciona ninguna de las variables para restringir la búsqueda

SET @incoming_name = NULL;
SET @incoming_value = NULL;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

Obtendrás todos los resultados de la tabla

1         abc             12
2         def             13
4         mkg             14
5         pcr             10

Uso de variables en su secuencia de comandos

Usando este método no tiene que SET nombres de variables en MySQL, eso fue solo para fines de demostración. También puede poner el valor de su código/script en otros idiomas. Por ejemplo, usando declaraciones preparadas de PHP y PDO

SELECT * FROM table1 
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)

Luego puede vincular sus variables de usuario a :incoming_name y :incoming_value y buscará como esperas. Si cualquiera de los dos es nulo, los omitirá; de lo contrario, serán necesarios en la búsqueda.

Advertencia: No he probado este código, es solo para darle una idea aproximada de cómo funcionaría. Utiliza PHPs PDO y declaraciones preparadas como se documenta aquí .

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

$stmt = $dbh->prepare("SELECT * FROM table1 
    WHERE (:incoming_name1 = name OR :incoming_name2 IS NULL)
    AND (:incoming_value1 = value OR :incoming_value2 IS NULL)");
$stmt->bindParam(':incoming_name1', $name);
$stmt->bindParam(':incoming_name2', $name);
$stmt->bindParam(':incoming_value1', $value);
$stmt->bindParam(':incoming_value2', $value);

if ($stmt->execute()) {
  while ($row = $stmt->fetch()) {
    var_dump($row);
  }
}

Debe vincular cada parámetro en la consulta con un nombre separado, por lo que cuando queremos el mismo parámetro dos veces, debemos darle un nombre separado (incoming_value1 y incoming_value2 )