sql >> Database >  >> RDS >> Mysql

mysql, vraag met naar waar voorwaarde, als de ene waarde =iets

Gebruik haakjes in uw zoekopdracht om uw WHERE-componentitems logisch te groeperen.

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

Als u een zoekopdracht probeert te geven die twee variabelen accepteert, en zoekt op basis van die variabelen, zit u er maar een klein beetje naast.

Met beide variabelen geleverd

Ervan uitgaande dat we twee variabelen hebben @incoming_name en @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)

Dit geeft je

1        abc       12

Met één variabele meegeleverd

Als de gebruiker vervolgens NULL opgeeft voor een van deze waarden, zal hij deze overslaan in uw zoekopdracht.

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)

Dit geeft je nog steeds het verwachte resultaat

1        abc       12

Zonder opgegeven variabelen

Als de gebruiker geen van beide variabelen opgeeft om de zoekopdracht te verfijnen

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)

U krijgt alle resultaten uit de tabel

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

Vabelen gebruiken in je script

Met deze methode hoeft u niet te SET variabelenamen in MySQL, dat was alleen voor demonstratiedoeleinden. Je kunt de waarde van je code/script ook in andere talen zetten. Bijvoorbeeld met behulp van PHP en PDO voorbereide Statments

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

Vervolgens kunt u uw gebruikersvariabelen binden aan :incoming_name en :incoming_value en het zal zoeken zoals u verwacht. Als een van beide nul is, worden ze overgeslagen, anders zijn ze vereist bij het zoeken.

Waarschuwing: Ik heb deze code niet getest, het is alleen om je een idee te geven van hoe het zou werken. Het gebruikt PHP's BOB en voorbereide verklaringen zoals hier gedocumenteerd .

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

Je moet elke parameter in de query binden met een aparte naam, daarom moeten we, wanneer we dezelfde parameter twee keer willen hebben, een aparte naam geven (incoming_value1 en incoming_value2 )



  1. Dynamische draaitabel maken met de functie QUOTENAME

  2. Hoe kom ik van een MySql-server naar een Android-app?

  3. Oracle JDBC:onderstroom in dubbel

  4. PostgreSQL-aanmaakfunctie