Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql, Abfrage mit to where Bedingung, wenn der eine Wert =irgendetwas ist

Verwenden Sie Klammern in Ihrer Abfrage, um die Elemente Ihrer WHERE-Klausel logisch zu gruppieren.

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

Wenn Sie versuchen, eine Abfrage bereitzustellen, die zwei Variablen akzeptiert, und auf der Grundlage dieser Variablen sucht, liegen Sie in Ihrer Logik nur geringfügig daneben.

Mit beiden bereitgestellten Variablen

Angenommen, wir haben zwei Variablen @incoming_name und @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)

Dadurch erhalten Sie

1        abc       12

Mit einer bereitgestellten Variablen

Wenn der Benutzer dann NULL für einen dieser Werte angibt, werden sie bei Ihrer Suche übersprungen.

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)

Dadurch erhalten Sie immer noch das erwartete Ergebnis

1        abc       12

Ohne Variablen angegeben

Wenn der Benutzer keine der Variablen angibt, um die Suche einzugrenzen

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)

Sie erhalten alle Ergebnisse aus der Tabelle

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

Variablen in Ihrem Skript verwenden

Bei dieser Methode müssen Sie nicht SET Variablennamen in MySQL, das war nur zu Demonstrationszwecken. Sie können den Wert aus Ihrem Code/Skript auch in anderen Sprachen angeben. Zum Beispiel mit PHP und PDO Prepared Statements

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

Dann können Sie Ihre Benutzervariablen an :incoming_name binden und :incoming_value und es wird wie erwartet gesucht. Wenn beide null sind, werden sie übersprungen, andernfalls werden sie bei der Suche benötigt.

Warnung: Ich habe diesen Code nicht getestet, er soll Ihnen nur eine ungefähre Vorstellung davon geben, wie er funktionieren würde. Es verwendet PHPs PDO und vorbereitete Anweisungen, wie hier dokumentiert .

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

Sie müssen jeden Parameter in der Abfrage mit einem separaten Namen binden, weshalb wir ihm einen separaten Namen geben müssen, wenn wir denselben Parameter zweimal wollen (incoming_value1 und incoming_value2 )