Могу ли я использовать столбец, который я выбрал позже в запросе?


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

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
 WHERE `hits` + `other_hits` > 30
Как вы можете видеть, я повторил добавление hits и other_hits. Могу ли я ссылаться на столбец total_hits, созданный в других частях запроса?

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

5 3

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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