Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql, requête avec condation où, si la valeur unique =n'importe quoi

Utilisez des crochets dans votre requête pour regrouper logiquement les éléments de votre clause WHERE.

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

Si vous essayez de fournir une requête qui accepte deux variables et que vous effectuez des recherches basées sur ces variables, vous n'êtes que légèrement décalé dans votre logique.

Avec les deux variables fournies

En supposant que nous ayons deux variables @incoming_name et @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)

Cela vous donnera

1        abc       12

Avec une variable fournie

Ensuite, si l'utilisateur fournit NULL pour l'une de ces valeurs, il les ignorera dans votre recherche.

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)

Cela vous donne toujours le résultat attendu

1        abc       12

Aucune variable fournie

Si l'utilisateur ne fournit aucune des variables pour affiner la recherche

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)

Vous obtiendrez tous les résultats du tableau

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

Utiliser des variables dans votre script

En utilisant cette méthode, vous n'avez pas à SET noms de variables dans MySQL, c'était juste à des fins de démonstration. Vous pouvez également mettre la valeur de votre code/script dans d'autres langues. Par exemple, en utilisant PHP et PDO Prepared Statements

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

Ensuite, vous pouvez lier vos variables utilisateur à :incoming_name et :incoming_value et il recherchera comme prévu. Si l'un ou l'autre est nul, il les ignorera, sinon ils seront requis dans la recherche.

Avertissement : Je n'ai pas testé ce code, c'est juste pour vous donner une idée approximative de son fonctionnement. Il utilise PHPs PDO et les déclarations préparées comme documenté ici .

$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);
  }
}

Vous devez lier chaque paramètre de la requête avec un nom distinct, c'est pourquoi lorsque nous voulons le même paramètre deux fois, nous devons lui donner un nom distinct (incoming_value1 et incoming_value2 )