Вы можете использовать словари для этого. Словари - это хранилища ключей и ценностей.
>>> dct = {'x': 1, 'y': 2, 'z': 3}
>>> dct
{'y': 2, 'x': 1, 'z': 3}
>>> dct["y"]
2
Вы можете использовать имена переменных ключей для достижения эффекта переменных переменных без риска для безопасности.
>>> x = "spam"
>>> z = {x: "eggs"}
>>> z["spam"]
'eggs'
В тех случаях, когда вы думаете сделать что-то вроде
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
список может быть более подходящим, чем dict. Список представляет упорядоченную последовательность объектов с целыми индексами:
l = ['foo', 'bar', 'baz']
print(l[1]) # prints bar, because indices start at 0
l.append('potatoes') # l is now ['foo', 'bar', 'baz', 'potatoes']
Для упорядоченных последовательностей списки удобнее, чем dict с целыми ключами, потому что списки поддерживают итерацию в порядке индекса, slicing , append
и другие операции, которые потребуют неудобного управления ключами с помощью dict.
Вы можете использовать предложение HAVING, которое может видеть псевдонимы, например
HAVING avg_rating>5
, но в предложении where вам нужно будет повторить свое выражение, например.
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
НО! Не все выражения будут разрешены - использование агрегирующей функции, такой как SUM, не будет работать, и в этом случае вам нужно будет использовать предложение HAVING.
Из руководства MySQL :
Нельзя ссылаться на псевдоним столбца в предложении WHERE, поскольку значение столбца может еще не определяться при выполнении предложения WHERE. См. Раздел B.1.5.4, «Проблемы с псевдонимами столбцов» .
blockquote>
Ваш запрос статичен, вы можете определить его как представление, тогда вы можете использовать этот псевдоним в предложении where при запросе представления.
Этот вопрос довольно старый, и один ответ уже получил 160 голосов ...
Тем не менее я бы сделал это ясно: на самом деле вопрос not о том, могут ли имена псевдонимов используется в предложении WHERE
.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
является агрегацией. В предложении WHERE
мы ограничиваем записи, которые мы хотим от таблиц, просматривая их значения. sum(reviews.rev_rating)
и count(reviews.rev_id)
, однако, не являются значениями, которые мы находим в записи; они являются значениями, которые мы получаем только после агрегирования записей.
Таким образом, WHERE
является неуместным. Нам нужно HAVING
, так как мы хотим ограничить строки результатов после агрегации. Это не может быть
WHERE avg_rating > 10
и
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
, следовательно.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
, с другой стороны, возможно и соответствует стандарту SQL , В то время как
HAVING avg_rating > 10
возможен только в MySQL. Он недействителен SQL в соответствии со стандартом, поскольку предложение SELECT
должно быть выполнено после HAVING
. Из документов MySQL:
Другое расширение MySQL для стандартного SQL разрешает ссылки в предложении HAVING на псевдонимы в списке выбора.
Расширение MySQL позволяет использовать псевдоним в предложении HAVING для агрегированного столбца
blockquote>https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Не знаю, если это работает в mysql, но с помощью sqlserver вы также можете просто обернуть его, как:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
HAVING
выполняется после того, как данные извлечены, аWHERE
выполняется раньше. – StockB 15 February 2017 в 20:16