Могу ли я использовать столбец, который я выбрал позже в запросе?
Представьте себе этот запрос...
SELECT `id`,
`hits` + `other_hits` AS `total_hits`
FROM `something`
WHERE `hits` + `other_hits` > 30
Как вы можете видеть, я повторил добавление hits
и other_hits
. Могу ли я ссылаться на столбец total_hits
, созданный в других частях запроса?
Я попробовал, и я получил 1054: неизвестный столбец в предложении where .
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;
Это имеет дополнительное преимущество-возможность индексироваться для очень быстрого извлечения по сравнению с вычисляемым столбцом в запросе.