Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql, truy vấn với điều kiện đến đâu, nếu một giá trị =bất kỳ thứ gì

Sử dụng dấu ngoặc trong truy vấn của bạn để nhóm các mục mệnh đề WHERE của bạn một cách hợp lý.

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

Nếu bạn đang cố gắng cung cấp một truy vấn chấp nhận hai biến và tìm kiếm dựa trên những biến đó, bạn chỉ hơi sai logic của mình.

Với cả hai biến được cung cấp

Giả sử chúng ta có hai biến @incoming_name@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)

Điều này sẽ mang lại cho bạn

1        abc       12

Với một biến được cung cấp

Sau đó, nếu người dùng cung cấp NULL cho một trong các giá trị đó, nó sẽ bỏ qua chúng trong tìm kiếm của bạn.

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)

Điều này vẫn mang lại cho bạn kết quả như mong đợi

1        abc       12

Không có biến nào được cung cấp

Nếu người dùng không cung cấp biến nào để thu hẹp tìm kiếm

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)

Bạn sẽ nhận được tất cả các kết quả từ bảng

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

Sử dụng các biến trong tập lệnh của bạn

Sử dụng phương pháp này, bạn không phải SET tên biến trong MySQL, chỉ dành cho mục đích trình diễn. Bạn cũng có thể đặt giá trị từ mã / tập lệnh của mình bằng các ngôn ngữ khác. Ví dụ:sử dụng các trạng thái chuẩn bị sẵn của PHP và PDO

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

Sau đó, bạn có thể liên kết các biến người dùng của mình với :incoming_name:incoming_value và nó sẽ tìm kiếm như bạn mong đợi. Nếu một trong hai vô hiệu, nó sẽ bỏ qua chúng, nếu không chúng sẽ được yêu cầu trong tìm kiếm.

Cảnh báo: Tôi chưa thử nghiệm mã này, nó chỉ để cung cấp cho bạn một ý tưởng sơ bộ về cách nó sẽ hoạt động. Nó sử dụng PHP PDO và các câu lệnh đã chuẩn bị sẵn như được ghi ở đây .

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

Bạn cần liên kết mỗi tham số trong truy vấn với một tên riêng biệt, đó là lý do tại sao khi chúng ta muốn cùng một tham số hai lần, chúng ta cần đặt tên riêng cho nó (incoming_value1incoming_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. Đường dẫn tuyệt đối của Flowfile Nifi

  2. Cx-Freeze:Showwarning AttributeError:Đối tượng 'NoneType' không có thuộc tính 'write'

  3. Xuất sang csv / excel theo cách để bao gồm số 0 ở đầu

  4. Cập nhật cột với giá trị ngẫu nhiên

  5. Việc thêm 'LIMIT 1' vào các truy vấn MySQL có làm cho chúng nhanh hơn khi bạn biết rằng sẽ chỉ có 1 kết quả không?