Как мне считать записи MySQL с критерием HAVING

0

Итак, вы можете просто сделать

SELECT COUNT(field.id) FROM table WHERE field.id > 100

и COUNT (поле) вернет количество записей, у которых есть критерий поля .id > 100

Но тогда что, если вы хотите подсчитать записи, указанные с помощью критерия HAVING, такие как

SELECT COUNT(field.id), field.id * 10 AS foo FROM table HAVING foo > 100

код не будет работать в этом случае....

Как мне перейти на подсчет записей, чей критерий указан с помощью предложения HAVING?

Заранее спасибо

  • 0
    В вашем примере HAVING используется слишком часто. Используйте ГДЕ или придумайте другой пример.
  • 1
    Я не могу выполнить ни один запрос как есть - они дают мне ошибку 1140 за использование агрегата без предложения GROUP BY (IE: COUNT(field.id) ). Кажется, что все совсем не относится к агрегату, просто возможность ссылаться на псевдоним столбца для сравнения ...
Теги:
aggregate-functions
having

3 ответа

5
Лучший ответ

Ну, COUNT работает ПЕРЕД HAVING применяется к набору результатов . Поэтому, если вам нужно подсчитать их число - вам нужно обернуть свой запрос другим.

SELECT COUNT(*) FROM (
    SELECT field.id * 10 AS foo FROM table HAVING foo > 100
)
  • 0
    это здорово, хотя мне нужно было добавить запрос в SELECT COUNT (*) FROM (SELECT field.id * 10 AS foo ИЗ таблицы, имеющей foo> 100) AS
  • 0
    @kamikaze_pilot: да, я забыл, что в этом случае мы должны дать псевдоним для вложенного запроса.
2

Я не могу запустить запрос as-is - они дают мне ошибку 1140 для "использования агрегата без предложения GROUP BY" (IE: COUNT(field.id)). Все, кажется, вообще не относится к совокупности, просто возможность ссылаться на псевдоним столбца для сравнения...

Наиболее широко поддерживаемые средства:

SELECT field.id * 10 AS foo 
  FROM table 
 WHERE field.id * 10 > 100

MySQL поддерживает ссылку на псевдоним столбца в предложении GROUP BY или HAVING. Он не требует использования обратных ссылок, но я видел экземпляры, которые не будут работать (зарезервированные слова) до тех пор, пока не появятся обратные ссылки:

SELECT field.id * 10 AS foo 
  FROM table 
HAVING `foo` > 100

Я не рекомендую этот подход - он поддерживается на SQL Server, но не Oracle...

Предложение HAVING похоже на предложение WHERE, разница в том, что предложение HAVING поддерживает агрегированные функции без необходимости их обертывания в подзапрос.

  • 1
    @Martin Smith: Может быть, но недавно возник вопрос, который не сработал бы, если бы псевдоним не был в запятой, поэтому я буду ошибаться в сторону предосторожности.
  • 0
    Кстати, ваш второй запрос всегда будет возвращать пустой набор из-за HAVING
Показать ещё 11 комментариев
1

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ - я тестировал это только на SQL Server

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

SELECT COUNT(field.id), field.id * 10 AS foo FROM table HAVING foo > 100

потому что field.id не содержится в предложении, которое определяет группу или агрегатную функцию; он просто не компилируется.

С учетом сказанного, следующий SQL -

SELECT COUNT(field.id) FROM table HAVING COUNT(field.id) > 100

вернет количество строк в таблице, если число больше 100. Если это не так, результат не получится.

У вас есть конкретная проблема? Что вы пытаетесь подсчитать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню