Uruchamiane przeze mnie zapytanie jest następujące, jednak pojawia się ten błąd:
# 1054 - Nieznana kolumna „gwarantowany kod pocztowy” w „podzapytaniu IN / ALL / ANY”
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE `guaranteed_postcode` NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Moje pytanie brzmi: dlaczego nie mogę użyć fałszywej kolumny w klauzuli where tego samego zapytania DB?
mysql
sql
mysql-error-1054
James
źródło
źródło
HAVING
działa wolniej niżWHERE
having
jest to, że wartości kolumn muszą być obliczone do czasu dotarcia dohaving
. Nie jest tak w przypadkuwhere
, jak stwierdzono powyżej.Jak zauważył Victor, problem dotyczy aliasu. Można tego jednak uniknąć, umieszczając wyrażenie bezpośrednio w klauzuli WHERE x IN y:
Wydaje mi się jednak, że jest to bardzo nieefektywne, ponieważ podzapytanie należy wykonać dla każdego wiersza zewnętrznego zapytania.
źródło
Standardowy SQL (lub MySQL) nie zezwala na użycie aliasów kolumn w klauzuli WHERE, ponieważ
(z dokumentacji MySQL ). Możesz obliczyć wartość kolumny w klauzuli WHERE , zapisać wartość w zmiennej i użyć jej na liście pól. Na przykład możesz to zrobić:
Pozwala to uniknąć powtarzania wyrażenia, gdy staje się skomplikowane, co ułatwia utrzymanie kodu.
źródło
select @code:=sum(2), 2*@code
działa w MySQL 5.5, ale dla mnie w 5.6 druga kolumna zwraca NULL przy pierwszym wywołaniu i zwraca 2 razy poprzedni wynik po ponownym uruchomieniu. Interesujące jest to, że zarówno select, jak@code:=2, 2*@code
iselect @code:=rand(), 2*@code
wydają się działać w moim 5.6 (dziś). Ale rzeczywiście piszą i czytają w klauzuli SELECT; w twoim przypadku ustawiasz to w GDZIE.Może moja odpowiedź jest za późna, ale może to pomóc innym.
Możesz dołączyć go do innej instrukcji select i użyć klauzuli where.
calcAlias to obliczona kolumna aliasowa.
źródło
Możesz użyć klauzuli HAVING dla filtra obliczonego w polach SELECT i aliasach
źródło
WHERE
iHAVING
. Nie są identyczni. stackoverflow.com/search?q=where+vs+havingKorzystam z mysql 5.5.24 i działa następujący kod:
źródło
Standardowy SQL nie zezwala na odwołania do aliasów kolumn w klauzuli WHERE. To ograniczenie jest nałożone, ponieważ podczas oceny klauzuli WHERE wartość kolumny mogła nie zostać jeszcze określona. Na przykład następujące zapytanie jest nielegalne:
WYBIERZ id, COUNT (*) AS cnt OD tbl_name GDZIE cnt> 0 GROUP BY id;
źródło
Możesz użyć SUBSTRING (
locations
.raw
, -6,4), aby ustalić gdzie warunekźródło