Могу ли я использовать столбец, который я выбрал позже в запросе? - PullRequest
3 голосов
/ 01 июня 2011

Представьте себе этот запрос ...

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
 WHERE `hits` + `other_hits` > 30

Как видите, я повторил добавление hits и other_hits. Могу ли я сослаться на столбец total_hits, который я создал в других частях запроса?

Я попробовал это, и я получил 1054: Неизвестный столбец в предложении где .

Ответы [ 5 ]

6 голосов
/ 01 июня 2011

Использование:

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
HAVING `total_hits` > 30

Самым ранним MySQL, допускающим ссылки на псевдонимы столбцов, является предложение GROUP BY;предложения после этого поддерживают ссылки (HAVING, ORDER BY).Большинство других баз данных не поддерживают ссылки на псевдоним таблицы перед ORDER BY, что обычно требует использования производной таблицы / встроенного представления:

SELECT t.id, t.total_hits
  FROM (SELECT `id`,
               `hits` + `other_hits` AS `total_hits`
          FROM `something`) t
 WHERE t.total_hits > 30

В противном случае вам придется повторно использовать логику в предложении WHERE:

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
 WHERE `hits` + `other_hits` > 30
1 голос
/ 01 июня 2011

Вы должны обратиться к формуле, а не к имени столбца.Имя столбца не оценивается, пока не будет оценен оператор SELECT, то есть ПОСЛЕ оператора WHERE.К сожалению, вам нужно будет повторить оператор дважды, как вы это делали, если только вы не обернули оператор следующим образом:

SELECT *
FROM (
SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`) as t
 WHERE `total_hits` > 30

Обратите внимание на проблему с производительностью, хотя в этом ваш внутренний SELECT оценивается для каждого элемента,Это может вызвать проблемы для вас или нет, в зависимости от дизайна вашего стола.

1 голос
/ 01 июня 2011

Вы можете использовать вычисляемую переменную в предложении HAVING, так как она оценивается после выбора.

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
 GROUP BY `id`, `total_hits`
 HAVING `total_hits` > 30

Опять возникнут проблемы с производительностью, так как вычисление будет выполнено для всей таблицы до фильтрации.

1 голос
/ 01 июня 2011

Нельзя использовать предложение WHERE для ссылки на псевдонимы столбцов.

Вы можете попробовать:

SELECT t.*
FROM (
  SELECT `id`, `hits` + `other_hits` AS `total_hits`
  FROM `something`) t
WHERE t.`total_hits` > 30
0 голосов
/ 01 июня 2011

Добавьте столбец в таблицу с именем total_hits, затем определите триггеры INSERT и UPDATE , чтобы вычислить значение столбца при вставке строки.Тогда вы можете просто сделать это:

SELECT
  `id`, `total_hits`
FROM `something`
WHERE `total_hits` > 30;

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

...