Mysql
 sql >> Database >  >> RDS >> Mysql

mysql, interroga con to where condation, se l'unico valore =qualsiasi cosa

Usa le parentesi nella tua query per raggruppare logicamente gli elementi della tua clausola WHERE.

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

Se stai cercando di fornire una query che accetti due variabili e cerchi in base a tali variabili, sei solo leggermente fuori dalla tua logica.

Con entrambe le variabili fornite

Presumendo di avere due variabili @incoming_name e @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)

Questo ti darà

1        abc       12

Con una variabile fornita

Quindi, se l'utente fornisce NULL per uno di questi valori, li salterà nella ricerca.

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)

Questo ti dà ancora il risultato atteso

1        abc       12

Senza variabili fornite

Se l'utente non fornisce nessuna delle variabili per restringere la ricerca

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)

Riceverai tutti i risultati dalla tabella

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

Utilizzo di variabili nel tuo script

Utilizzando questo metodo non è necessario SET nomi di variabili in MySQL, era solo a scopo dimostrativo. Puoi inserire il valore dal tuo codice/script anche in altre lingue. Ad esempio utilizzando le dichiarazioni preparate PHP e PDO

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

Quindi puoi associare le tue variabili utente a :incoming_name e :incoming_value e cercherà come ti aspetti. Se uno dei due è nullo, li salterà, altrimenti saranno richiesti nella ricerca.

Avviso: Non ho testato questo codice, è solo per darti un'idea approssimativa su come funzionerebbe. Utilizza PHP PDO e istruzioni preparate come documentato qui .

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

Devi associare ogni parametro nella query con un nome separato, motivo per cui quando vogliamo lo stesso parametro due volte dobbiamo assegnargli un nome separato (incoming_value1 e incoming_value2 )