MySQL - использование COUNT (*) в предложении WHERE

113

Я пытаюсь выполнить следующее в MySQL (см. код pseudo)

SELECT DISTINCT gid
FROM `gd`
WHERE COUNT(*) > 10
ORDER BY lastupdated DESC

Есть ли способ сделать это, не используя (SELECT...) в предложении WHERE, потому что это может показаться пустой тратой ресурсов.

Вся помощь приветствуется.

Спасибо!

Теги:

8 ответов

203

попробуйте это;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc
  • 32
    +1 для того, чтобы иметь Это всегда пункт, который Они не удосуживаются преподавать должным образом на курсах или книгах sql, и зная об этом, как правило, признак того, что кодер достиг уровня новичка.
  • 0
    Что если вы пытаетесь использовать COUNT () как часть логического выражения OR? например, AND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
Показать ещё 2 комментария
21

Я не уверен, что вы пытаетесь сделать... может быть, что-то вроде

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC
  • 1
    MSSQL дает «недопустимое имя столбца» ошибка синтаксического анализа для num . +1 в любом случае для чистого синтаксиса (это может быть моя установка или мс ... аааа)
  • 0
    Укажите псевдоним для всех столбцов в списке выбора.
12

попробовать

SELECT DISTINCT gid
FROM `gd`
group by gid
having count(*) > 10
ORDER BY max(lastupdated) DESC
10
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

EDIT (если вы просто хотите получить цифры):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC
  • 0
    Спасибо Джо, но это возвращает COUNT () - я ищу, чтобы вернуть все гиды, которые имеют COUNT (*) более 10
  • 1
    Там нет необходимости Min () там.
8

Просто академическая версия без предложения:

select *
from (
   select gid, count(*) as tmpcount from gd group by gid
) as tmp
where tmpcount > 10;
4

- поиск метеорологических станций с отсутствующими полумесячными записями

SELECT stationid
FROM weather_data 
WHERE  `Timestamp` LIKE '2011-11-15 %'  AND 
stationid IN (SELECT `ID` FROM `weather_stations`)
GROUP BY stationid 
HAVING COUNT(*) != 48;

- изменение yapiskan с a where.. in.. select

2

В предложении WHERE не может быть агрегатных функций (пример COUNT, MAX и т.д.). Следовательно, вместо этого мы используем предложение HAVING. Поэтому весь запрос будет похож на этот:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
1

Я думаю, вы не можете добавить count() с помощью where. теперь посмотрим, почему....

where не является таким же, как having, having означает, что вы работаете или работаете с группой и той же работой подсчета, а также со всей группой,

теперь, как считать, что он работает как целая группа

создайте таблицу и введите некоторый идентификатор, а затем используйте:

select count(*) from table_name

вы найдете, что общие значения означают, что это указывает на некоторую группу! поэтому where добавляется count();

Ещё вопросы

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