ist es möglich im where ausdruck auf temporäre datenfelder zu verwenden

mathiasb

Neuer Benutzer
Beiträge
3
Hallo!
Das ist mein Vorhaben:

SELECT lokal_name, ((laengengrad - 48.2585139)*71.5)*((laengengrad - 48.2585139)*71.5) AS laengendiff, ((breitengrad - 16.4633033)*111.3)*((breitengrad - 16.4633033)*111.3) AS breitendiff FROM `user_lokale_liste_test1` WHERE SQRT(@laengendiff*@breitendiff) < 15

Leider kommt kein Ergebnis zustande. Ist die Abfrage so möglich?
Bzw dürfte der Ausdruck SQRT(@laengendiff*@breitendiff) nur NULL ergeben. Hat jemand eine Idee? Oder bin ich da überhaupt falsch unterwegs?

Danke!
 
Zuletzt bearbeitet:
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.150
Hallo!
Das ist mein Vorhaben:

SELECT lokal_name, ((laengengrad - 48.2585139)*71.5)*((laengengrad - 48.2585139)*71.5) AS laengendiff, ((breitengrad - 16.4633033)*111.3)*((breitengrad - 16.4633033)*111.3) AS breitendiff FROM `user_lokale_liste_test1` WHERE SQRT(@laengendiff*@breitendiff) < 15


Da du fragst, hast es sicher schon erfolgreich im sinne vom erfolglos probiert und kennst somit die Antwort.

Es wird zuerst die WHERE-Condition ausgeführt. Zu diesem Zeitpunkt ist Deine Berechnung mit dem Alias aber noch nicht ausgeführt. Soweit verstanden?

PS.: Deine Abfrage wird bei größeren Datenmengen lahm sein. MySQL kennt weder funktionale Indexe noch materialized Views. Das nur am Rande.
 

mathiasb

Neuer Benutzer
Beiträge
3
Wow! Danke für die schnelle Antwort. Hatte eine ähnliche Abfrage im Netz gefunden und war wohl zu euphorisch.

Könnte ich hier eine temporäre Tabelle erstellen und dann dort die Ergebnisse sortieren?
 

akretschmer

Datenbank-Guru
Beiträge
9.150
Wow! Danke für die schnelle Antwort. Hatte eine ähnliche Abfrage im Netz gefunden und war wohl zu euphorisch.

Könnte ich hier eine temporäre Tabelle erstellen und dann dort die Ergebnisse sortieren?


Zum nachmalen:

Code:
test=# create table mathias (i int, val int);
CREATE TABLE
Time: 1,155 ms
test=*# insert into mathias values (1,1);
INSERT 0 1
Time: 0,325 ms
test=*# select i, val + 1 as new_val from mathias where new_val = 2;
ERROR:  column "new_val" does not exist
LINE 1: select i, val + 1 as new_val from mathias where new_val = 2;
  ^
Time: 0,224 ms
test=*# select * from (select i, val + 1 as new_val from mathias ) bla where new_val = 2;
 i | new_val
---+---------
 1 |  2
(1 row)
 

akretschmer

Datenbank-Guru
Beiträge
9.150
Zum nachmalen:

Code:
test=# create table mathias (i int, val int);
CREATE TABLE
Time: 1,155 ms
test=*# insert into mathias values (1,1);
INSERT 0 1
Time: 0,325 ms
test=*# select i, val + 1 as new_val from mathias where new_val = 2;
ERROR:  column "new_val" does not exist
LINE 1: select i, val + 1 as new_val from mathias where new_val = 2;
  ^
Time: 0,224 ms
test=*# select * from (select i, val + 1 as new_val from mathias ) bla where new_val = 2;
i | new_val
---+---------
1 |  2
(1 row)


Mit einer materialized View würde es z.B. so gehen:

Code:
test=*# create materialized view matview_mathias as select i, val, val + 1 as new_val from mathias ;
SELECT 1
Time: 5,574 ms
test=*# select * from matview_mathias where new_val = 2;
 i | val | new_val
---+-----+---------
 1 |  1 |  2
(1 row)

Fragt man das immer ab, kann man einen Index definieren:

Code:
test=*# create index idx_new_val on matview_mathias (new_val);
CREATE INDEX
Time: 5,150 ms
test=*#

Vorteil eines mat. Views: die Berechnung wird nicht jedes mal neu ausgeführt. Und der View ist, anders als eine temp. Tabelle, persistent. Via Statement-TRIGGER on insert / update / delete könnte man den View aktuell halten, oder via CRON einmal täglich, oder oder oder ...
 

akretschmer

Datenbank-Guru
Beiträge
9.150
Danke! Werde es gleich so umsetzen.

Da bin ich ja gespannt. MySQL kann keine materialized Views. Die andere Lösung wäre ein funktionale Index:

Code:
test=*# create index idx1 on mathias ((val + 1));
CREATE INDEX
Time: 3,683 ms
test=*# set enable_seqscan=off;
SET
Time: 0,063 ms
test=*# explain select * from mathias where (val+1) = 2;
  QUERY PLAN
--------------------------------------------------------------------
 Index Scan using idx1 on mathias  (cost=0.13..8.14 rows=1 width=8)
  Index Cond: ((val + 1) = 2)
(2 rows)

Kann MySQL aber auch nicht.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.409
Natürlich kann man die Berechnung auch in der WHERE Klausel ausführen nur schön ist das eben nicht. Man kann sich eben nicht mit einem Alias auf den Select beziehen sondern muss die Berechnung vollständig aufnehmen.

Im Übrigen kannst du mit @laengendiff nicht auf laengendiff verweisen. In MS SQL nutzt man @ für deklarierte Variablen. Auch wenn das in MySQL nicht zwingend notwendig ist verwirrt das schon wenn @ in Spaltennamen verwendet wird.
 
Oben