Доктрина и псевдонимы из предложения select в предложении where - PullRequest
1 голос
/ 30 июня 2010

Я использую псевдоним в своем предложении select (AVG(u.rating) as avg_rating) и затем хотел бы добавить его в мое предложение where avg_rating > 3, но когда я пытаюсь выполнить этот запрос, я получаю Unknown column 'u3__1' in 'where clause'.

Кто-нибудь знает, как я могу получить свое предложение where, чтобы увидеть псевдоним? Этот псевдоним работает в orderBy без проблем, только не в where.

РЕДАКТИРОВАТЬ: (для более подробной информации)

Выше приведен пример, но вот реальный отрендеренный SQL, не такой простой. Моя проблема на самом деле с псевдонимом по значению с кучей условий. И псевдоним, с которым у меня возникают проблемы, - это сгенерированная дата, которая имеет повторения и не обязательна для каждого поля даты. Поэтому я публикую простой SQL-запрос, который вызывает у меня ту же проблему.

SELECT t.type_id as type_alias, t.* FROM theme as t WHERE t.id > 1 AND type_alias = 3

А вот реальный запрос, если вам это интересно:

SELECT t.id AS t__id, t.created_by AS
t__created_by, t.type_id AS
t__type_id, t.url_slug AS t__url_slug,
t.name AS t__name, t.description AS
t__description, t.summary AS
t__summary, t.start_month AS
t__start_month, t.start_day AS
t__start_day, t.start_year AS
t__start_year, t.duration_unit AS
t__duration_unit, t.duration_length AS
t__duration_length, t.is_active AS
t__is_active, t.is_public AS
t__is_public, t.needs_moderation AS
t__needs_moderation, t.recurrence AS
t__recurrence, t.tag_string AS
t__tag_string, t.date_created AS
t__date_created, t.date_updated AS
t__date_updated, AVG(t2.rating) AS
t2__0, IF(t.recurrence = "none",
STR_TO_DATE(CONCAT(t.start_month,
t.start_day, t.start_year), "%m%d%Y"),
(IF(STR_TO_DATE(CONCAT(t.start_month,
t.start_day, YEAR(NOW())), "%m%d%Y") >
NOW(),
STR_TO_DATE(CONCAT(t.start_month,
t.start_day, YEAR(NOW())), "%m%d%Y"),
STR_TO_DATE(CONCAT(t.start_month,
t.start_day, (YEAR(NOW())+1)),
"%m%d%Y")))) AS t__1, (COUNT(u.id) +
COUNT(e.id)) AS u__2 FROM theme t LEFT
JOIN theme_rating t2 ON t.id =
t2.theme_id LEFT JOIN
user_saves_themes u ON t.id =
u.theme_id LEFT JOIN event e ON
((e.is_active = 1 AND e.theme_id =
t.id)) WHERE t.id IN ('3', '2', '1')
AND (IF(t.recurrence = "none",
STR_TO_DATE(CONCAT(t.start_month,
t.start_day, t.start_year), "%m%d%Y"),
(IF(STR_TO_DATE(CONCAT(t.start_month,
t.start_day, YEAR(NOW())), "%m%d%Y") >
NOW(),
STR_TO_DATE(CONCAT(t.start_month,
t.start_day, YEAR(NOW())), "%m%d%Y"),
STR_TO_DATE(CONCAT(t.start_month,
t.start_day, (YEAR(NOW())+1)),
"%m%d%Y")))) >=
FROM_UNIXTIME(1278001295) AND
t.is_public = ? AND t.is_active = ?)
GROUP BY t.id ORDER BY t__1

Ответы [ 2 ]

1 голос
/ 10 ноября 2016

Посмотрите на это:

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

Стандартный SQL запрещает ссылки на псевдонимы столбцов в предложении WHERE.Это ограничение наложено потому, что при оценке предложения WHERE значение столбца может еще не быть определено.Например, следующий запрос недопустим:

Либо необходимо добавить предложение HAVING, либо повторить псевдоним в предложении WHERE.

1 голос
/ 30 июня 2010

Попробуйте вместо вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...