K logickému seskupení položek klauzule WHERE použijte v dotazu hranaté závorky.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Pokud se pokoušíte zadat dotaz, který přijímá dvě proměnné a vyhledává na základě těchto proměnných, jste ve své logice jen trochu mimo.
S oběma proměnnými
Za předpokladu, že máme dvě proměnné @incoming_name
a @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)
Tím získáte
1 abc 12
S jednou proměnnou dodanou
Pokud pak uživatel pro některou z těchto hodnot zadá hodnotu NULL, při hledání je přeskočí.
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)
To vám stále poskytuje očekávaný výsledek
1 abc 12
Bez dodaných proměnných
Pokud uživatel nezadá žádnou z proměnných pro zúžení vyhledávání
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)
Všechny výsledky získáte z tabulky
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Použití proměnných ve skriptu
Při použití této metody nemusíte SET
názvy proměnných v MySQL, to bylo jen pro demonstrační účely. Hodnotu z kódu/skriptu můžete vložit i do jiných jazyků. Například pomocí PHP a PDO Připravené výpisy
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Potom můžete své uživatelské proměnné svázat s :incoming_name
a :incoming_value
a bude hledat, jak očekáváte. Pokud jsou některé z nich nulové, přeskočí je, jinak budou při hledání vyžadovány.
Upozornění: Tento kód jsem netestoval, je to jen pro hrubou představu, jak by to fungovalo. Používá PHP PDO a připravené příkazy, jak je zdokumentováno zde .
$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);
}
}
Každý parametr v dotazu musíte svázat se samostatným názvem, a proto, když chceme stejný parametr dvakrát, musíme mu dát samostatný název (incoming_value1
a incoming_value2
)