Datenabfrage will keine AS variable in WHERE

PowerCheat

Erfahrenes Mitglied
Code:
SELECT dat.ZIP AS PLZ, dat.City AS Stadt, dat.lng, dat.lat, ROUND( 6378.388 * ACOS( SIN( RADIANS( stadt.lat ) ) * SIN( RADIANS( dat.lat ) ) + COS( RADIANS( stadt.lat ) ) * COS( RADIANS( dat.lat ) ) * COS( RADIANS( dat.lng ) - RADIANS( stadt.lng ) ) ) ) AS Distanz
FROM geodata AS stadt, geodata AS dat
WHERE (
stadt.ZIP = '".$mysqli->real_escape_string($_GET["city"])."' AND `Distanz` <= 20
)
GROUP BY dat.id
ORDER BY Distanz

Warum nimmt er dort in der WHERE abfrage kein DISTANZ?

Ich kriege die Kriese...
 
Warum nimmt er dort in der WHERE abfrage kein DISTANZ?
Weil gar kein Feld "DISTANZ" in dem DB-Objekt existiert, dass Du durch "FROM" als Quelle angegeben hast.

P.S. Mach doch ein "ORDER BY 5", wenn Deine Zeit so knapp ist.
 
Zuletzt bearbeitet:
Hallo PowerCheat,

es gibt 2 Möglichkeiten:
1. du nimmst den ganzen Ausdruck in die WHERE-Klausel
Code:
WHERE (
stadt.ZIP = '".$mysqli->real_escape_string($_GET["city"])."' AND (ROUND( 6378.388 * ACOS( SIN( RADIANS( stadt.lat ) ) * SIN( RADIANS( dat.lat ) ) + COS( RADIANS( stadt.lat ) ) * COS( RADIANS( dat.lat ) ) * COS( RADIANS( dat.lng ) - RADIANS( stadt.lng ) ) ) )
) <= 20
)
Das gleiche gilt für den ORDER BY.

2. du benutzt einen SubSelect
Code:
select PLZ, Stadt, dat.lng, dat.lat, Distanz
from (
    SELECT dat.ZIP AS PLZ, dat.City AS Stadt, dat.lng, dat.lat, dat.id, ROUND( 6378.388 * ACOS( SIN( RADIANS( stadt.lat ) ) * SIN( RADIANS( dat.lat ) ) + COS( RADIANS( stadt.lat ) ) * COS( RADIANS( dat.lat ) ) * COS( RADIANS( dat.lng ) - RADIANS( stadt.lng ) ) ) ) AS Distanz
    FROM geodata AS stadt, geodata AS dat
    WHERE (
    stadt.ZIP = '".$mysqli->real_escape_string($_GET["city"])."')
     )
WHERE (`Distanz` <= 20 )
GROUP BY id
ORDER BY Distanz
Dies hat aber den Nachteil, das der SubSelect zuerst ohne die Distanz-Einschränkung läuft und es evtl. etwas länger dauert.
 
Zurück