[ 357_97 @ 02.04.2011. 14:37 ] @
Imam sledeci problem. Upit
Code:
SELECT news_id AS nid FROM news WHERE nid > 1;
vraca gresku
Code:
ERROR 1054 (42S22): Unknown column 'nid' in 'where clause'
Ono sto me cudi je da se upit
Code:
SELECT news_id FROM news WHERE news_id > 1
izvrsi kako treba. Pa me interesuje zasto baca ovu gresku? MySQL server je 5.1.36.

Pretpostavljam da je resenje krajnje trivijalno!
[ biske86 @ 02.04.2011. 14:50 ] @
To što si stavio "as nid" ne znaci da mozes da koristis nid u where uslovu. To nid ti sluzi samo u rezultatu upita da se naziv kolone ne zove news_id nego nid.
A ako hoćeš da ti radi upit stavi news_id u where uslovu..
[ biske86 @ 02.04.2011. 14:55 ] @
To je zbog toga što u trenutku kad se računa WHERE uslov, vrednost tog alijasa nije poznata. Na primer
Code (mysql):
SELECT id, COUNT(*) AS cnt FROM tbl_name
WHERE cnt > 0 GROUP BY id;

Ovde u trenutku računanja da li je cnt>0, vrednost cnt nije poznata.

Više o ovome pogledaj na stranici:
http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
[ 357_97 @ 02.04.2011. 15:17 ] @
To sam video i bilo mi je logicno da zbog GROUP BY, COUNT(*) AS cnt nije izracunat. S druge strane milsio sam da se to neodnosi na moj primer jer sam samo napravio alias na kolonu koja vec postoji - news_id AS nid.

To znaci da bi upit bio validan moram da uradim ovako nesto (2 puta ponovim isto racunjanje)
Code:
SELECT user_id, TIMESTAMPDIFF(YEAR, user_dob, NOW()) AS age
FROM users
WHERE TIMESTAMPDIFF(YEAR, user_dob, NOW()) > 18
[ Nikola Poša @ 02.04.2011. 16:12 ] @
Za takve jednostavne, neagregatne upite nikad nisam koristio HAVING klauzulu, ali ovo bi trebalo da prođe:
Code:
SELECT user_id, TIMESTAMPDIFF(YEAR, user_dob, NOW()) AS `age`
FROM users
HAVING `age` > 18
[ bogdan.kecman @ 02.04.2011. 16:42 ] @
357 - da, stim da ce upit da radi hiljadama puta brze ako umesto

WHERE ... TIMESTAMPDIFF(YEAR, user_dob, NOW()) > 18 ...

stavis

WHERE ... user_dob < now() - interval 1 year ...

u prvom slucaju imao/nemao index nad user_dob radis full table scan dok u drugom slucaju ako imas index nad user_dob radis range scan nad indexom sto je mnoooogo brze



nikola - having je zeznut zato se uslov proverava nad vec dobijenim rezultatom tako da je spor