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
)