2010-09-20 4 views
0

Так обычно вы можете просто сделатьКак подсчитать записи MySQL с HAVING критерия

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

и COUNT (поле) возвращает количество записей, которое имеет критерий field.id> 100

Но что делать, если что считать записи, указанные с HAVING критерия, такие как

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

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

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

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

+0

В вашем примере ** HAVING ** используется чрезмерно. Используйте ** ГДЕ ** или придумайте другой пример. – zerkms

+1

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

ответ

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 FROM table HAVING foo> 100 ) AS получено –

+0

@kamikaze_pilot: yup, я забыл, что в в этом случае мы должны дать псевдоним для вложенного запроса. – zerkms

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. Если это не так, вы не получите никакого результата.

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

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

@ Мартин Смит: Может быть, но в последнее время возник вопрос, который не работал бы, если бы псевдоним не был в обратном направлении Я ошибаюсь в сторону осторожности. –

+0

Кстати, ваш второй запрос всегда будет возвращать пустой набор из-за 'HAVING' – zerkms

+0

@zerkms: Оба эквивалентны –

Смежные вопросы