2016-09-12 2 views
0

Ich habe versucht, hier in SO für einen ähnlichen Fall suchen, aber ich kann nicht das richtige Suchergebnis finden. Mein Problem ist folgendes:.PHP MySQL Berechnung AS funktioniert nicht

Ich habe diese Abfrage, die eine Menge von Ergebnissen (net_salary ist das Ergebnis der Subtraktion zwischen salary und totaldeductions Felder fein und zeigt Werke, die sowohl als float gespeichert sind, kann ich mich nicht erinnern, warum, aber ich brauchte sie als Schwimmer speichern):

SELECT name, address, city, state, zip_code, salary-totaldeductions as net_salary FROM employees WHERE state = 'CA' ORDER BY address ASC

Wenn ich versuche, es zu ändern, und fügen sie AND net_salary > 5000 die Seite/Rahmen wird leer:

SELECT name, address, city, state, zip_code, salary-totaldeductions as net_salary FROM employees WHERE state = 'CA' AND net_salary > 5000 ORDER BY address ASC

Ich habe versucht zu suchen, wo der Code fehlschlägt, es scheint if (mysqli_stmt_prepare($stmt, $MyQuery)) schlägt fehl. Die erste Abfrage funktioniert und net_salary funktioniert, aber auf der zweiten Abfrage, wo ich versuchte mit der Variablen net_salary in einer Bedingung, die es ausfällt, ist es falsch, die Variable zu verwenden, die in einer Abfrage als Bedingung in einer Abfrage erstellt wurde? Kannst du erkennen, was falsch war?

+2

Versuch ---> AND (Gehalt - Summeduktionen)> 5000 –

+1

Die where-Klausel wertet zuerst die Bedingung aus, und zu diesem Zeitpunkt ist der AS net_salary ein unbekannter. Versuchen Sie die von @TheOneandOnlyChemistryBlob – Valkyrurr

+0

Art Dezimal (anstelle von Float) vorgeschlagen hätte auch gearbeitet, da monetäre Werte immer genau 2 Ziffern nach dem Komma –

Antwort

1

Um das Ergebnis versuchen unter Abfrage zu erhalten:

SELECT name, address, city, state, zip_code, (salary - totaldeductions) as net_salary FROM employees WHERE state = 'CA' AND (salary - totaldeductions) > 5000 ORDER BY address ASC 

Hier können Sie, wo die Bedingungen gleichen Zustand versetzen müssen. Wenn Sie einen Alias ​​in where verwenden möchten, wird es nicht funktionieren, aber Having wird verwendet, aber Having wird mit der aggregierten Spalte verwendet.

Versuchen Sie diese Abfrage.

+0

Ich habe 'Gehalt - Gesamtduktionen als Nettowert' ohne Klausel verwendet, da es nur einen Rechenschritt gibt da, aber das machte mir klar, dass mein Fehler Alias ​​in einer WHERE-Anweisung in der MySQL-Query – jay

+0

war. Vergiss nicht upvote !!! :) –

0

Da net_salary ist ein Alias ​​Ich glaube, Sie HAVING statt WHERE verwenden müssen:

SELECT name, address, city, state, zip_code, salary-totaldeductions as net_salary FROM employees WHERE state = 'CA' HAVING net_salary > 5000 ORDER BY address ASC 

In Zukunft, wenn ein SQL-Aufruf fehlschlägt, können Sie bei $stmt->error schauen, um zu sehen, was falsch gelaufen ist.

+0

HAVING verweist auf GROUP BY oder aggregiert keine Aliase –

+0

@TheOneandOnlyChemistryBlob Actualy -> "MySQL erweitert dieses Verhalten, um die Verwendung eines Alias ​​in der HAVING-Klausel für die aggregierte Spalte zuzulassen". Sie haben mit den meisten RDBMS recht, aber nicht mit MySQL. – sagi

+1

'HAVING' kann sich auch auf Aliase beziehen. –