Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> jak uproscic takie zapytanie
Rozpalacz
post
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


  1. SELECT id_pracownika, imie, DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( data_urodzenia ) ) , '%Y' ) +0 AS age
  2. FROM `pracownicy` WHERE DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( data_urodzenia ) ) , '%Y' ) +0 =27
  3. LIMIT 0, 30

da sie jakos zastąpić "DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( data_urodzenia ) ) , '%Y' ) +0" by nie pisac go drugi raz?

chcialem zrobic cos takiego:
  1. SELECT id_pracownika, imie, DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( data_urodzenia ) ) , '%Y' ) +0 AS age
  2. FROM `pracownicy` WHERE age =27
  3. LIMIT 0, 30

ale nie dziala sad.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
melkorm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Kod
age =27


daj liczbe w apostrofach ;p

a jeżeli masz daty całe to chyba możesz zastosować

  1. (YEAR(NOW()) - YEAR(birthDate)) AS age


smile.gif


--------------------
Go to the top of the page
+Quote Post
Rozpalacz
post
Post #3





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


nie działa;

Unknown column 'age' in 'where clause'
Go to the top of the page
+Quote Post
melkorm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


w warunku musi powtórzyć tą czynność ;]


--------------------
Go to the top of the page
+Quote Post
kitol
post
Post #5





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

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


w warunku nie można używać aliasów ja zrobiłbym tak:
  1. SELECT id_pracownika, imie, age FROM ( SELECT id_pracownika, imie, DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( data_urodzenia ) ) , '%Y' ) +0 AS age
  2. FROM `pracownicy`) AS tbl2

Ale to może być mało wydajne dla dużych tabel.
Go to the top of the page
+Quote Post
nevt
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


pewnie, że da się uprościć i niczego nie trzeba powielać, wystarczy użyć właściwej składni oraz właściwych funkcji:
  1. SELECT `id_pracownika`, `imie`, FLOOR(DATEDIFF(NOW(), `data_urodzenia`)/365) AS `age` FROM `pracownicy` HAVING `age`=27 LIMIT 30 ;

powodzenia.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
melkorm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Fakt, nie wiedziałem że "having" ma właśnei takie użycie smile.gif

Zawsze można się czegoś nwoego nauczyć z forum ;]


--------------------
Go to the top of the page
+Quote Post
topp
post
Post #8





Grupa: Zarejestrowani
Postów: 5
Pomógł: 1
Dołączył: 3.10.2008

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


Jeszcze taka drobna uwaga na przyszłość:
jeśli masz możliwość, to staraj się nie używać NOW() w zapytaniu, które będzie wymagało jego wywołania wiele razy. Ta funkcja jest niedeterministyczna, co sprawia, że silnik nie cachuje jej wyniku i za każdym razem wywołuje na nowo. W końcu nie chciałbyś, pytając o bieżący czas, dostać zapamiętanej odpowiedzi sprzed paru minut, prwada? winksmiley.jpg
Jeśli dasz mysqlowi do przejrzenia paręset tyś. rekordów, to wywołasz NOW paręset tysięcy razy. winksmiley.jpg

W takiej sytuacji lepiej przypisać przed zapytaniem wartość NOW() do jakiejś zmiennej, a potem użyć tej zmiennej w zapytaniu.
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 Aktualny czas: 22.08.2025 - 01:47