2012-07-27 9 views
5

Ich habe eine Abfrage wie folgt:MySQL Inner schließt sich an einem Alias ​​einer berechneten Spalte

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND distance = L.mindistance 

Wenn ich es lassen wie es ist, halte ich immer:

Unknown column 'distance' in 'on clause' 

Aber wenn ich setzen User.distance statt nur distance, bekomme ich:

MySQL syntax error near.... 

Kann ich nicht alias 'so auf ein berechnetes Feld verwenden? Die 10 * 10 ist nur ein einfacher Platzhalter, da die Berechnung viel komplexer ist.

+0

mögliches Duplikat von [Die Verwendung des Spaltenalias in der WHERE-Klausel der MySQL-Abfrage führt zu einem Fehler] (http://stackoverflow.com/questions/942571/using-column-aliass-in-where-clause-of-mysql- query-produces -an-error) – Joni

Antwort

0
SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user_id AND L.mindistance =10*10 
0

Sie können nicht abgeleitete Werte in einer Abfrage verwendet, wo Klausel - wo verwendet wird, Datensätze zu beschränken und welche Indizes verwenden - abgeleitete Werte können nicht vom Optimierer verwendet werden, so dass Sie die endgültigen Ergebnisse filtern müssen .

nicht ganz sicher, was Sie tun, sondern versuchen, so etwas wie:

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user 
HAVING USERS.distance = L.mindistance 
5

Um zu vermeiden, um die Berechnung dreimal in der Abfrage zu machen, können Sie die äußere Berechnung in einem FROM subselect wickeln, das wird geben Sie die Alias-Feldnamen zugreifen (wo es nicht zugänglich in Ihrer ursprünglichen Abfrage war):

SELECT a.* 
FROM 
(
    SELECT id, 10*10 AS distance 
    FROM USERS 
) a 
INNER JOIN 
(
    SELECT user_id, 
    MIN(10 * 10) AS mindistance 
    FROM Location 
    GROUP BY user_id 
) L ON a.id = L.user_id AND a.distance = L.mindistance 

Hier wird die Berechnung nur zwei statt drei mal getan.

10

Sie versuchen, einen Spaltenalias in der Klausel ON zu verwenden. Die MySQL documentation hat dies über diese Situation zu sagen:

Die bedingungs_ausdruck verwendet mit ON ist jeder bedingter Ausdruck der Form, die in einer WHERE-Klausel verwendet werden kann.

And also:

Standard-SQL nicht zulässt, Verweise auf Spaltenaliasnamen in einer WHERE-Klausel. Diese Einschränkung wird auferlegt, da bei der Auswertung der WHERE-Klausel der Spaltenwert möglicherweise noch nicht ermittelt wurde. Zum Beispiel ist die folgende Abfrage illegal:

Das heißt, Sie können Verwendung Variablen den Ausdruck in der ON Klausel zu berechnen und dann den Wert in der Spaltenliste verwenden, wie folgt aus:

SELECT User.id, @dist as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND (@dist := 10*10) = L.mindistance 
+0

Es gibt keine WHERE-Klausel in der SQL des Autors. –

+1

behoben @ JohnFactorial – Joni

Verwandte Themen