Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Odwołanie do aliasu
Forum PHP.pl > Forum > Przedszkole
Rysh
Zacząłem dziś bawić się zapytaniami w MySQL i napotkałem jeden problem, oraz pojawiło się w mojej głowie jedno pytanie.

Zacznę od pytania. Czy lepiej pograć dane z MySQL i obrobić je w PHP, a następnie walnąć UPDATE. Chodzi mi tu oczywiście o szybkość i wydajność.

A problem mam taki, że mam przykładowo zapytanie:
  1. SELECT 20 AS liczba, liczba+20;

W jaki sposób mogę odwołać się do tego utworzonego aliasu, jeśli nie pobieram żadnych danych z tabel tylko po postu dla takiej liczby chce ustawić alias.

Jeśli ktoś jest taki ciekawski po co mi to, to już tłumaczę (może jest jakieś inne rozwiązanie), chciałbym pobrać kiedy użytkownik zalogował się ostatnio, od aktualnego czasu odjąć ostatnią wizytę i nazwać ja przykładowo roznica_czasu, a następnie operować na tym aliasie. Czyli coś w ten deseń:
  1. SELECT (NOW()-uzytkownik.aktualizacja)/60 AS roznica_czasu FROM uzytkownik
Sephirus
Zdecydowanie lepiej działać od razu na MySQL. Czyli jesli się da jakąś prostą operację wykonać na MySQL to tak rób (po to to jest).

Wyjątkiem może być jakieś naprawdę skomplikowane zapytanie, w którym dodatkowo dajesz dużą funkcjonalność - wtedy przy dużym obciażeniu i obszernej bazie można pomyśleć nad przejściem na PHP ale pamiętaj o jednym - PHP też może być przez to bardzo obciążone... Jeśli masz serwer PHP i MySQL na oddzielnych maszynach to tym bardziej powinno się przerzucić część takiej funkcjonalności na bazę wink.gif
bww
Na aliasie możesz operować tylko w danym zapytaniu.

Cytat
jeśli nie pobieram żadnych danych z tabel tylko po postu dla takiej liczby chce ustawić alias


Select from jest równoznaczny z pobraniem danych z jakiejś tabeli...

Może napisz co chcesz konkretnie zrobić z polem roznica_czasu.
Rysh
Cytat(bww @ 15.02.2012, 11:43:07 ) *
Na aliasie możesz operować tylko w danym zapytaniu.

Select from jest równoznaczny z pobraniem danych z jakiejś tabeli...

Może napisz co chcesz konkretnie zrobić z polem roznica_czasu.

No właśnie chyba się mylisz (lub ja) ponieważ SELECT zwraca niekoniecznie z tabeli, dla przykładu:
  1. SELECT NOW() AS czas

Zwróci nam aktualną datę i godzinę oraz przypisze jej alias czas, więc tabela mi do tego nie jest do niczego potrzebna.

Co chcę osiągnąć? Zaktualizować gracza bez pomocy php, tylko w mysql. Mam takie pytanie:
Kod
mysql> SELECT NOW() as teraz, gracze.aktualizacja, (SELECT SUM(produkcja) FROM mapa WHERE gracze.id_gracza=mapa.id_gracza) as produkcja FROM gracze;
+---------------------+---------------------+-----------+
| teraz               | aktualizacja        | produkcja |
+---------------------+---------------------+-----------+
| 2012-02-15 12:06:57 | 2012-02-15 10:28:32 |        60 |
+---------------------+---------------------+-----------+
1 row in set (0.00 sec)

Teraz posługując się samymi aliasami (chodzi tu głównie o wygodę) chciałbym obliczyć kilka rzeczy:
Obliczyć różnicę czasu jaka upłynęła od czasu ostatniej aktualizacji.
Obliczyć ile jednostek "wyprodukowano"
Pobrać resztę z dzielenia z "produkcji"
Resztę z dzielenia odjąć od aktualnego czasu
Walnąć UPDATE.

Takie coś chciałbym osiągnąć. Tylko za każdym razem pisać formułkę NOW() - gracze.aktualizacja to troszkę męczące i można się trochę pogubić. Mam nadzieję że dobrze określiłem swój problem.
bww
Chodziło mi o SELECT [...] FROM [...], bo takiej konstrukcji użyłeś w zapytaniu z różnicą czasu.

Tak jak pisałem operowanie na aliasie może się odbywać w ramach jednego zapytania np.

Select aaa.alias11 from(
Select aa.alias1 as alias11 from (
(Select a.column1 as alias1, a.column2 as alias2 from tabela as a) as aa) aaa)

itd.
Rysh
Cytat(bww @ 15.02.2012, 12:32:23 ) *
Chodziło mi o SELECT [...] FROM [...], bo takiej konstrukcji użyłeś w zapytaniu z różnicą czasu.

Tak jak pisałem operowanie na aliasie może się odbywać w ramach jednego zapytania np.

Select aaa.alias11 from(
Select aa.alias1 as alias11 from (
(Select a.column1 as alias1, a.column2 as alias2 from tabela as a) as aa) aaa)

itd.

Pomyślałem, potestowałem, poczytałem i to co ja chcę osiągnąć to nic innego jak tworzenie procedur w mysql. Tworze procedurę, w niej odejmowanie jednego selecta od drugiego, zwracanie wyniku i gotowe. Chociaż myślałem, że osiągnę ten efekt przy pomocy samych aliasów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.