2009-09-02 8 views
8

Czy istnieje sposób obejścia problemu, abym mógł zrobić coś takiego bez konieczności powtarzania całego wyrażenia lub wymuszania UNION lub tabeli tymczasowej?Czy mogę ponownie użyć wyrażenia w zapytaniu MySQL jako zmiennej dla innego pola?

SELECT (complex expression) AS variable1, 
     (complex expression based on variable1) AS variable2 

Od variable1 nie jest zdefiniowane i dostępne na 2. pozycji, ponieważ, jak mysql działa powyższa koncepcja nie może pracować.

Muszę powtórzyć wyrażenie dla zmiennej 2, użyć tabeli UNION lub tabeli tymczasowej i użyć dwóch przebiegów.

Czy jest jakaś sztuczka, której nie jestem świadomy, aby wykonać to bardziej efektywnie?

(zauważ, że muszę znać odpowiedź zarówno variable1 i variable2 jak są następnie wykorzystywane do INSERT)

Dzięki za wszelkie pomysły!

+1

możliwe duplikat [Mogę resuse pola obliczeniowego w SELECT zapytania?] (http://stackoverflow.com/questions/6085443/can-i-resuse-a-calcalated-field-in-a-select-query) –

Odpowiedz

6

pchnięcie pierwszy obliczenie do tabeli pochodzącej:

select variable1 
    , complex_function(variable1, other_column) as variable2 
    , yet_another column 
    from (select complex_operation as variable1 
      , other_column 
      , yet_another_column 
      from whatever) dt 
+0

To bardziej nieprzyjemne, niż chciałem, ale mam zamiar dać ci najlepszą odpowiedź za wszystkie twoje wysiłki, dziękuję. –

4
SELECT @v1:=(complex expression) AS variable1, 
     (complex expression * @v1) AS variable2 
+0

Będę przerażony, jeśli to po prostu takie proste i szczerze nie mogłem ". T wymyślić, ale dziękuję! –

+4

Ah, wiesz co? Strona podręcznika wymieniona powyżej przez knittl ma powtarzające się ostrzeżenia, aby nie używać lub nie polegać na zmiennych ustawionych w tej samej instrukcji SELECT, ponieważ pola mogą być wykonywane poza kolejnością na podstawie WHERE itp., A zmienna jest wstrzymywana od poprzedniego wykonania. Ponowne użycie zmiennych w ramach tego samego SELECT jest prawdopodobnie złym pomysłem, jest przeznaczone dla zapytań sekwencyjnych. –

+0

Osobiście nigdy nie widziałem zachowania ostrzeganego w instrukcji, nawet po próbie wykonania. ale jeśli instrukcja ostrzega przed nim, to nie użyłbym go. * bleh * – longneck

0

Myślę, że jedynym sposobem jest powtórzenie pierwszego wystąpienia complex_expression w drugim, chociaż myślałem, że mysql poradzi sobie z takimi przypadkami.

edit: szybkie wyszukiwanie okazało się następująco: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

+0

Dziękuję za link, jakoś całkowicie pominąłem tę część MySQL! –

+0

Twój link do instrukcji był bardzo pomocny w zrozumieniu, dlaczego rozwiązanie longneck było wadliwe, jeszcze raz dzięki. –

Powiązane problemy