2017-02-08 1 views
2

ich die folgende Abfrage bin mit Daten aus MySQL-Datenbank zu erhalten und ich falsche Daten. Ich möchte alle Daten mit den cart_Status von 2 oder 3, die müssen erhalten view_Status von 1:Mysql Abfrage gibt falsche Daten mit where-Klausel

SELECT * FROM `cart` WHERE `view_Status` = 1 AND cart_Status = 2 OR `cart_Status` = 3 

Dies ist, wie meine Datenstruktur und Tabelle wie folgt aussehen:

enter image description here

Aber in Folge Es gibt etwas unabhängig von view_Status = 1, was nicht mein Ziel ist.

es zurück:

enter image description here

Natürlich ist es nicht etwas zurückgeben sollte! Aber es tut!

+1

Try this SELECT * FROM 'cart' WHERE 'view_Status' = 1 UND (cart_Status = 2 ODER' cart_Status' = 3) ' –

Antwort

3

Dies ist etwa Operator precendence.
Ihre Anfrage wertet als

SELECT * FROM `cart` WHERE (`view_Status` = 1 AND cart_Status = 2) OR `cart_Status` = 3 

sollten Sie Klammern hinzuzufügen:

SELECT * FROM `cart` WHERE `view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3) 
+1

Hoppla! Ich habe es vergessen. Danke :-) – Afshin

+2

Genannte Operator-Präzenz in irgendeiner Programmiersprache. – TheHe

1

Sie erscheinen SQL zu lernen. Verwenden Sie Klammern im WHERE Klausel, vor allem, wenn Sie AND und OR mischen.

jedoch in Ihrem Fall ist IN eine bessere Lösung:

SELECT c.* 
FROM `cart` c 
WHERE c.view_Status = 1 AND cart_Status IN (2, 3); 
1

Es ist ein Problem mit Vorrang Operatoren. Typischerweise AND vor OR in Programmiersprachen ausgeführt wird (man denke an AND als der Multiplikation von Bits und von OR als der Addition von Bits und Vorrang wird bekannt). Also, Ihr Zustand:

`view_Status` = 1 AND cart_Status = 2 OR `cart_Status` = 3 

wird wie folgt analysiert:

(`view_Status` = 1 AND cart_Status = 2) OR `cart_Status` = 3 

, die mit spezifischen cart_Status in allen Zeilen ergibt ausgewählt werden. Sie müssen Klammern um die zweite Klausel hinzuzufügen:

`view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3) 

oder, noch kürzer:

`view_Status` = 1 AND cart_Status IN (2, 3) 
2
SELECT * FROM `cart` WHERE `view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3) 

oder besser

SELECT * FROM `cart` WHERE `view_Status` = 1 AND cart_Status in (2, 3);