Отфильтровать запрос MySQL с использованием значения, созданного в том же запросе [duplicate]

Вы можете использовать словари для этого. Словари - это хранилища ключей и ценностей.

>>> 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.

97
задан 14 October 2008 в 07:49
поделиться

4 ответа

Вы можете использовать предложение 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, «Проблемы с псевдонимами столбцов» .

195
ответ дан Paul Dixon 22 August 2018 в 20:54
поделиться
  • 1
    Если я повторю это выражение, он говорит мне: «Недопустимое использование групповой функции». – user 14 October 2008 в 07:57
  • 2
    Переформулированы, чтобы сделать более понятными агрегатные функции – Paul Dixon 14 October 2008 в 08:04
  • 3
    Хорошее объяснение, особенно. & quot ;, но в условии where ... repeat .. & quot; часть – th3an0maly 17 January 2013 в 09:57
  • 4
    действительно спас мой день! большое спасибо за это! – Þaw 25 February 2014 в 10:09
  • 5
    Это прекрасный ответ, но, пожалуйста, рассмотрите последствия производительности, поскольку HAVING выполняется после того, как данные извлечены, а WHERE выполняется раньше. – StockB 15 February 2017 в 20:16

Ваш запрос статичен, вы можете определить его как представление, тогда вы можете использовать этот псевдоним в предложении where при запросе представления.

0
ответ дан alpere 22 August 2018 в 20:54
поделиться

Этот вопрос довольно старый, и один ответ уже получил 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 для агрегированного столбца

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

2
ответ дан Thorsten Kettner 22 August 2018 в 20:54
поделиться

Не знаю, если это работает в 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 ...
29
ответ дан Torbjörn Gyllebring 22 August 2018 в 20:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: