sql >> Database teknologi >  >> RDS >> Mysql

mysql, forespørg med til hvor kondation, hvis den ene værdi =enhver ting

Brug parenteser i din forespørgsel til at gruppere dine WHERE-klausulelementer logisk.

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

Hvis du forsøger at angive en forespørgsel, der accepterer to variabler, og søger baseret på disse variabler, er du kun lidt ude af din logik.

Med begge variabler leveret

Forudsat at vi har to variabler @incoming_name og @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)

Dette vil give dig

1        abc       12

Med én variabel leveret

Så hvis brugeren angiver NULL for en af ​​disse værdier, springer den over dem i din søgning.

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)

Dette giver dig stadig det forventede resultat

1        abc       12

Uden angivet variable

Hvis brugeren ikke angiver nogen af ​​variablerne for at indsnævre søgningen

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)

Du får alle resultaterne fra tabellen

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

Brug af variabler i dit script

Ved at bruge denne metode behøver du ikke SET variabelnavne i MySQL, det var kun til demonstrationsformål. Du kan også sætte værdien fra din kode/script på andre sprog. For eksempel ved hjælp af PHP og PDO Prepared Statements

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

Derefter kan du binde dine brugervariable til :incoming_name og :incoming_value og det vil søge som du forventer. Hvis en af ​​dem er nul, springer den over dem, ellers kræves de i søgningen.

Advarsel: Jeg har ikke testet denne kode, det er bare for at give dig en ide om, hvordan den ville fungere. Den bruger PHP'er PDO og forberedte erklæringer som dokumenteret her .

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

Du skal binde hver param i forespørgslen med et separat navn, hvilket er grunden til, at når vi ønsker den samme parameter to gange, skal vi give det et separat navn (incoming_value1 og incoming_value2 )



  1. Innodb sidestørrelsesindstilling

  2. MySQL 8.0.11 fejl ved forbindelse på grund af caching_sha2_password

  3. SQL CASE-erklæring

  4. Hvordan opretter man forbindelse til MySQL-database i PHP ved hjælp af mysqli-udvidelse?