Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql, zapytanie z to where condation, jeśli jedna wartość =cokolwiek

Użyj nawiasów w zapytaniu, aby logicznie pogrupować elementy klauzuli WHERE.

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

Jeśli próbujesz podać zapytanie, które akceptuje dwie zmienne i wyszukiwania oparte na tych zmiennych, Twoja logika jest tylko nieznacznie chybiona.

Po podaniu obu zmiennych

Zakładając, że mamy dwie zmienne @incoming_name i @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)

To da ci

1        abc       12

Z jedną dostarczoną zmienną

Następnie, jeśli użytkownik poda NULL dla którejkolwiek z tych wartości, pominie je podczas wyszukiwania.

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 nadal daje oczekiwany wynik

1        abc       12

Bez zmiennych

Jeśli użytkownik nie poda żadnej ze zmiennych, aby zawęzić wyszukiwanie

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)

Otrzymasz wszystkie wyniki z tabeli

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

Korzystanie ze zmiennych w skrypcie

Używając tej metody nie musisz SET nazwy zmiennych w MySQL, to tylko w celach demonstracyjnych. Możesz umieścić wartość ze swojego kodu/skryptu również w innych językach. Na przykład za pomocą przygotowanych wyciągów PHP i PDO

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

Następnie możesz powiązać zmienne użytkownika z :incoming_name i :incoming_value i będzie wyszukiwać zgodnie z oczekiwaniami. Jeśli któryś z nich jest pusty, pominie je, w przeciwnym razie będą wymagane w wyszukiwaniu.

Ostrzeżenie: Nie testowałem tego kodu, to tylko przybliżenie, jak to działa. Używa PHP PDO i przygotowanych instrukcji, jak udokumentowano tutaj .

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

Musisz powiązać każdy parametr w zapytaniu z osobną nazwą, dlatego gdy chcemy dwa razy ten sam parametr, musimy nadać mu osobną nazwę (incoming_value1 i incoming_value2 )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Niejednoznaczna kolumna w instrukcji INNER JOIN

  2. Zaćmienie brakujących połączeń z bazą danych

  3. problem z połączeniem ze zdalną bazą danych mysql za pomocą php

  4. Hosting MySQL na platformie Azure, w pełni zarządzana usługa bazy danych w chmurze wprowadzana na ScaleGrid

  5. Skrypt tworzenia użytkownika Mysql