Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql, consulta com para where condation, se o valor =qualquer coisa


Use colchetes em sua consulta para agrupar seus itens de cláusula WHERE logicamente.
WHERE name = 'abc' AND (value = 12 OR 1=1)

Se você está tentando fornecer uma consulta que aceita duas variáveis ​​e pesquisa com base nessas variáveis, você está apenas um pouco errado em sua lógica.

Com ambas as variáveis ​​fornecidas

Presumindo que temos duas variáveis ​​@incoming_name e @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)

Isso lhe dará
1        abc       12

Com uma variável fornecida

Então, se o usuário fornecer NULL para qualquer um desses valores, ele os ignorará em sua pesquisa.
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)

Isso ainda lhe dá o resultado esperado
1        abc       12

Sem variáveis ​​fornecidas

Se o usuário não fornecer nenhuma das variáveis ​​para restringir a pesquisa
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)

Você obterá todos os resultados da tabela
1         abc             12
2         def             13
4         mkg             14
5         pcr             10

Usando variáveis ​​em seu script

Usando este método você não precisa SET nomes de variáveis ​​no MySQL, isso era apenas para fins de demonstração. Você pode colocar o valor do seu código/script em outras linguagens também. Por exemplo, usando Statments preparados para PHP e PDO
SELECT * FROM table1 
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)

Então você pode vincular suas variáveis ​​de usuário a :incoming_name e :incoming_value e ele pesquisará como você espera. Se um deles for nulo, ele os ignorará, caso contrário, eles serão necessários na pesquisa.

Aviso: Eu não testei este código, é apenas para lhe dar uma idéia aproximada de como ele funcionaria. Ele usa PHPs PDO e declarações preparadas conforme documentado aqui .
$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);
  }
}

Você precisa vincular cada parâmetro na consulta com um nome separado, e é por isso que quando queremos o mesmo parâmetro duas vezes precisamos dar um nome separado (incoming_value1 e incoming_value2 )