Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

mysql, kueri dengan kondisi ke mana, jika satu nilai =apa saja

Gunakan tanda kurung dalam kueri Anda, untuk mengelompokkan item klausa WHERE Anda secara logis.

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

Jika Anda mencoba memberikan kueri yang menerima dua variabel, dan menelusuri berdasarkan variabel tersebut, logika Anda hanya sedikit menyimpang.

Dengan kedua variabel yang disediakan

Anggap kita memiliki dua variabel @incoming_name dan @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)

Ini akan memberi Anda

1        abc       12

Dengan satu variabel yang disediakan

Kemudian jika pengguna memberikan NULL untuk salah satu dari nilai tersebut, nilai tersebut akan diabaikan dalam pencarian Anda.

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)

Ini masih memberi Anda hasil yang diharapkan

1        abc       12

Tanpa variabel yang disediakan

Jika pengguna tidak menyediakan salah satu variabel untuk mempersempit pencarian

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)

Anda akan mendapatkan semua hasil dari tabel

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

Menggunakan variabel dalam skrip Anda

Dengan menggunakan metode ini Anda tidak perlu SET nama variabel di MySQL, itu hanya untuk tujuan demonstrasi. Anda dapat memasukkan nilai dari kode/skrip Anda dalam bahasa lain juga. Misalnya menggunakan PHP dan Pernyataan yang Disiapkan PDO

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

Kemudian Anda dapat mengikat variabel pengguna Anda ke :incoming_name dan :incoming_value dan itu akan mencari seperti yang Anda harapkan. Jika salah satunya adalah null, mereka akan melewatinya, jika tidak, mereka akan diminta dalam pencarian.

Peringatan: Saya belum menguji kode ini, ini hanya untuk memberi Anda gambaran kasar tentang cara kerjanya. Ini menggunakan PHP PDO dan pernyataan yang disiapkan seperti yang didokumentasikan di sini .

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

Anda perlu mengikat setiap param dalam kueri dengan nama terpisah, itulah sebabnya ketika kami menginginkan param yang sama dua kali, kami harus memberinya nama terpisah (incoming_value1 dan 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. Perulangan PDO melalui dan pencetakan fetchAll

  2. Cara memilih nama kolom secara dinamis di mySQL

  3. Bagaimana cara melindungi file dari unduhan yang tidak sah

  4. Sertakan penghitung tambahan di set hasil MySQL

  5. Tanggal PHP menunjukkan '1970-01-01 ' setelah konversi