sql >> Databasteknik >  >> RDS >> Mysql

mysql, fråga med till where condation, om det ena värdet =någon sak

Använd parenteser i din fråga för att gruppera dina WHERE-klausulobjekt logiskt.

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

Om du försöker tillhandahålla en fråga som accepterar två variabler, och sökningar baserat på dessa variabler, har du bara lite fel i din logik.

Med båda variablerna tillhandahållna

Förutsatt att vi har två variabler @incoming_name och @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)

Detta ger dig

1        abc       12

Med en variabel tillhandahållen

Om användaren sedan anger NULL för något av dessa värden, hoppar den över dem i din sökning.

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)

Detta ger dig fortfarande det förväntade resultatet

1        abc       12

Utan inga variabler tillhandahållna

Om användaren inte anger någon av variablerna för att begränsa sökningen

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)

Du får alla resultat från tabellen

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

Använda variabler i ditt skript

Med den här metoden behöver du inte SET variabelnamn i MySQL, det var bara för demonstrationsändamål. Du kan lägga värdet från din kod/skript på andra språk också. Till exempel att använda PHP och PDO Prepared Statements

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

Sedan kan du binda dina användarvariabler till :incoming_name och :incoming_value och det kommer att söka som du förväntar dig. Om någon av dem är null kommer den att hoppa över dem, annars krävs de i sökningen.

Varning: Jag har inte testat den här koden, det är bara för att ge dig en ungefärlig uppfattning om hur det skulle fungera. Den använder PHP:s PDO och förberedda uttalanden som dokumenteras här .

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

Du måste binda varje param i frågan med ett separat namn, vilket är anledningen till att när vi vill ha samma param två gånger måste vi ge den ett separat namn (incoming_value1 och incoming_value2 )



  1. Fixa "ERROR 1222 (21000):De använda SELECT-satserna har ett annat antal kolumner" när du använder UNION i MariaDB

  2. Hur bestämmer du vilka SQL-tabeller som har en identitetskolumn programmatiskt

  3. Använder MySQL GROUP_CONCAT eller PIVOT på flera sammanfogade tabeller

  4. Ta bort poster från mer än 1 år sedan