2012-09-10 7 views
10

Ich frage mich, wie und/oder funktioniert?Mysql oder/und Vorrang?

Zum Beispiel, wenn ich alle Zeilen erhalten möchten, wo Anzeige = 1

ich WHERE tablename.display = 1

können und wenn ich alle Zeilen möchten, wo Anzeige = 1 oder 2

ich tun können WHERE tablename.display = 1 or tablename.display = 2

Aber was, wenn ich alle Zeilen erhalten möchten, wo Anzeige = 1 oder 2 und wo einen der Inhalt, Tags oder Titel enthält hello world

Wie würde die Logik dafür auskommen?

Select * from tablename 
where display = 1 or display = 2 and content like "%hello world%" or tags like "%hello world%" or title = "%hello world%" 

Wäre meine Vermutung. aber dann kann ich das auf verschiedene Arten lesen.

Ist es ausgelesen, wie:

(display = 1 or display = 2) and (content like "%hello world%" or tags like "%hello world%" or title = "%hello world%") 

oder als

((display = 1 or display = 2) and (content like "%hello world%")) or (tags like "%hello world%" or title = "%hello world%") 

usw.

+2

http://dev.mysql.com/doc/refman/5.5/en/operator-precedence.html – zerkms

+0

Diese Dinge werden während Ihrer frühen C/C++ - Klassen unterrichtet. –

+3

Dann schätze ich, dass ich mich für einen ganzen C/C++ - Kurs anmelden sollte, nur um die Vorrangstellung des Operators zu lernen:/ – Hailwood

Antwort

22

Die MySQL-Dokumentation eine good page mit Informationen hat, auf dem Betreiber Vorrang.

Von dieser Seite,

12.3.1. Bedienerpriorität

Die Operator-Präzedenz wird in der folgenden Liste angezeigt, von der höchsten Priorität bis zur niedrigsten. Operatoren, die zusammen auf einer Linie angezeigt werden, haben die gleiche Priorität.

INTERVAL 
BINARY, COLLATE 
! 
- (unary minus), ~ (unary bit inversion) 
^ 
*, /, DIV, %, MOD 
-, + 
<<, >> 
& 
| 
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN 
BETWEEN, CASE, WHEN, THEN, ELSE 
NOT 
&&, AND 
XOR 
||, OR 
= (assignment), := 

So Ihre ursprüngliche Abfrage

Select 
    * 
from tablename 
where 
    display = 1 
    or display = 2 
    and content like "%hello world%" 
    or tags like "%hello world%" 
    or title = "%hello world%" 

würde als

Select 
    * 
from tablename 
where 
    (display = 1) 
    or (
     (display = 2) 
     and (content like "%hello world%") 
    ) 
    or (tags like "%hello world%") 
    or (title = "%hello world%") 

Im Zweifelsfall interpretiert werden, Klammern verwenden, um Ihre Absicht deutlich zu machen. Während die Informationen auf der MySQL-Seite hilfreich sind, ist es möglicherweise nicht sofort ersichtlich, ob die Abfrage jemals erneut besucht wird.

Sie könnten etwas wie das Folgende betrachten. Beachten Sie, dass ich die title = "%hello world%" in title like "%hello world%" geändert habe, da dies besser zu dem von Ihnen beschriebenen Ziel passt.

Select 
    * 
from tablename 
where 
    (
     (display = 1) 
     or (display = 2) 
    ) and (
     (content like "%hello world%") 
     or (tags like "%hello world%") 
     or (title like "%hello world%") 
    ) 
0

in allen SQL-Servern, AND Vorrang vor OR nimmt, so denken Sie daran, Klammern zu setzen um Ihr OR s:

select * from tablename 
where (display = 1 or display = 2) 
and (content like "%hello world%" 
     or tags like "%hello world%" 
     or title = "%hello world%") 


btw (display = 1 or display = 2) entspricht display in (1, 2).

+0

Bitte sehen Sie meinen Zusatz zu meiner Frage. es ist in Bezug auf Klammern nicht zu haben, wie es ausgeht? – Hailwood

3

Sie müssen Klammern für Ihre multiple OR Bedingungen verwenden. Und für display = 1 OR display = 2 können Sie display IN(1,2) verwenden. Versuchen Sie folgendes:

SELECT * FROM tableName 
WHERE display IN (1,2) 
AND (content LIKE "%hello world%" 
OR tags LIKE "%hello world%" 
OR title LIKE "%hello world%") 

Für mehr Informationen Blick auf MySQL: Operator Precedence

+0

Nein, das würde nicht wie erwartet funktionieren – zerkms

+0

@zerkms Jetzt sehen. – hims056

1

diese Abfrage ausführen:

select 1 or 1 and 0 

Wenn es darum geht, wie 1 aus, dann bedeutet der Vorrang ist:

select 1 or (1 and 0) 

wenn es 0 kommt, dann wird der Vorrang ist:

Spoiler: es kommt 1

Das zu sagen ist AND s vor OR s ausgewertet werden, oder, wie ich sagen, ANDs sind klebriger.