Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Odwołanie do aliasu
Rysh
post 15.02.2012, 11:27:32
Post #1





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Sephirus
post 15.02.2012, 11:35:54
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
bww
post 15.02.2012, 11:43:07
Post #3





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 14.02.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Rysh
post 15.02.2012, 12:14:50
Post #4





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
bww
post 15.02.2012, 12:32:23
Post #5





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 14.02.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Rysh
post 15.02.2012, 15:32:42
Post #6





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2025 - 06:35