2016-05-04 3 views
0

Ich habe unterschiedliche Ergebnisse auf, was scheint, die gleiche Abfrage sein. Ich bin sehr verwirrt darüber, warum die Gesamtsumme von den Abfragen abweicht. Hoffentlich hat jemand eine Erklärung zu diesem Thema und vielleicht sagen Sie, welche die richtige Summe sein sollte. DankeUnterschied auf Gesamtsummen auf mysql Abfrage

select sum(tm_hours) 
FROM bhds_timecard 
WHERE (tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
or tm_notes = 'PT' 
or tm_notes = 'Speech') 
AND (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 

Diese beläuft sich auf insgesamt 1792,25

SELECT SUM(tm_hours) 
FROM bhds_timecard 
WHERE (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
OR tm_notes = 'PT' 
OR tm_notes = 'Speech' 

Diese beträgt 1796,25

+0

die beiden Abfragen sind buchstäblich identisch. Meinst du, dass du jedes Mal unterschiedliche Summen bekommst, wenn du die Abfrage ausführst? – Danilo

+0

muss eine neue Zeile (n) zwischen den 2 Läufen Ihrer Anfrage eingefügt werden? –

+0

so tut mir leid ich eingefügt falsche Abfrage jetzt habe ich zwei verschiedene Abfragen – joanb

Antwort

1

Wenn Sie verstehen, warum 5 + 3 * 2 = 11 dann wird dies helfen, die Quelle Ihres Problems zu verstehen. Einige Leute könnten fälschlicherweise denken, dass die obige Berechnung Ihnen 16 geben sollte, weil sie sich der Reihenfolge der Operationen nicht bewusst sind. Die Multiplikation hat Vorrang vor der Addition, so dass sie zuerst ausgeführt wird.

Ebenso hat AND eine höhere Priorität als OR, also wird es zuerst gemacht. Sehen Sie sich den Abschnitt Operator Precedence im MySQL-Referenzhandbuch an.

Dies ist wahrscheinlich der Code, den Sie zu bauen versuchten:

SELECT SUM(tm_hours) 
FROM bhds_timecard 
WHERE tm_date BETWEEN '2016-04-01' AND '2016-04-30' 
AND (tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
OR tm_notes = 'PT' 
OR tm_notes = 'Speech'); 

In diesem Fall, da Klammern die Standard Reihenfolge der Vorgänge außer Kraft setzen, alles in den Klammern zuerst ausgeführt wird (das sind alle OR-Anweisungen) . Daher wird der gesamte Abschnitt in Klammern als WAHR ausgewertet, wenn nur eine der Bedingungen WAHR ist). Als nächstes werden alle Ihre ANDS ausgewertet und Sie haben Ihre Antwort.

+1

entspricht. Hervorragende Erklärung! ich danke dir sehr!. Ich verstehe jetzt – joanb

0

zweite Abfrage so sein muss:

SELECT SUM(tm_hours) FROM bhds_timecard WHERE (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND (tm_notes = 'Session' OR tm_notes = 'Intake' OR tm_notes = 'OT' OR tm_notes = 'PT' OR tm_notes = 'Speech') 

Sie verlieren die ( Halterung für die zweite Gruppe von Bedingungen

0

Die erste Abfrage wird alle Ihre OR s als eine Bedingung Auswertung -

WHERE (tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
or tm_notes = 'PT' 
or tm_notes = 'Speech') 
AND (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 

Wenn eine Zeile eine dieser Bedingungen erfüllt, wertet sie als wahr und geht dann zu dem Zeitpunkt Einschränkung auf. Es gibt also wirklich nur zwei Top-Level-Bedingungen in der ersten Abfrage.

Die zweite Abfrage tatsächlich 6 Bedingungen -

WHERE (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
OR tm_notes = 'PT' 
OR tm_notes = 'Speech' 

Wenn eine der 6 OR s wahr ist, die ganze WHERE Klausel als wahr ausgewertet wird.

+0

das macht Sinn, danke! Warum würde es eine Rolle spielen, wenn eine der Bedingungen zu wahr ist, wenn ich am Ende die Summe für den gegebenen Monat haben möchte, wobei tm_notes entweder der Bedingung – joanb

0

Ihre ersten Abfragebedingungen sind wie diese

Where 
--first condition 
(tm_notes = 'Session' OR tm_notes = 'Intake' OR tm_notes = 'OT' or tm_notes = 'PT' or tm_notes = 'Speech') 
AND 
-- second condition 
(tm_date BETWEEN '2016-04-01' AND '2016-04-30') 

Sie beide die Bedingungen wählen, um wahr zu sein, erste Bedingung selbst eine Kombination von Bedingungen,

Während in der zweiten Abfrage haben Sie so viele Bedingungen mit OR und so, wenn eine der Bedingungen erfüllt wird das gesamte Muster Bedingung bekommt wahr und so ist es der Unterschied im Ergebnis

Where 
-- first condition 
(tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND 
-- second condition 
tm_notes = 'Session' 
OR 
-- third condition 
tm_notes = 'Intake' 
OR 
-- fourth condition 
tm_notes = 'OT' 
OR 
-- fifth condition 
tm_notes = 'PT' 
-- sixth condition 
OR 
tm_notes = 'Speech' 
+0

entspricht, die Sinn macht, danke! Warum würde es eine Rolle spielen, wenn eine der Bedingungen zu wahr ist, wenn ich am Ende die Summe für den gegebenen Monat haben möchte, wobei tm_notes entweder der Bedingung – joanb

0

AND & OR Arbeit wie + & -

a+(b*c) nicht das gleiche ist wie (a+b)*c

Das Gleiche gilt für AND & OR

a OR (b AND c) ist nicht das gleiche wie (a OR b) AND c

So mit Klammern vorsichtig sein, wenn du mischt dich AND

Verwandte Themen